WINAPI dialog. Przykładowy kod

0

Ostatnimi dniami wziąłem się za naukę WINAPI no i przy pierwszej lekcji z dialogami wystąpił problem. Nic nie kminie.

I chciałem prosić was czy mógł by się ktoś podzielić jakimś gotowym kodem źródłowym jednego z najprostszych okien dialogowych. Bo chciał bym to na spokojnie przeanalizować od początku do końca jako spójna całość.

Osobiście korzystam z tego kursu:

http://darkcult.gamedev.pl/index.html

0

Najprostszy jest na stronie, którą podałeś.
http://darkcult.home.pl/wiki/index.php?title=Podstawy_WinAPI#Wielki_finisz.21

Pokaż to, co naskrobałeś.

0

Mnie wlasnie denerwowaly strasznie te polskie kursy winapi, wedlug nich zeby stworzyc okno dialogowe musisz utworzyc okno glowne, a to nie prawda, poniewaz mozesz dac jako glowne pulpit.

Tutaj mam jakis kodzik do prostego crackme ;)

#include <stdio.h>
#include <windows.h>

#include "resource.h"

BYTE buff[24], serial[20];

BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int main(void)
{
	DialogBoxParam(NULL, MAKEINTRESOURCE(ID_DIALOG), NULL, DialogProc, 0);

	return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
		case WM_COMMAND:
		{
			switch(wParam)
			{
				case IDOK:
				{
                                        ;
				} break;
				case IDCANCEL:
					EndDialog(hWnd, IDCANCEL);
					break;
			}
		} break;
		default:
			return FALSE;
	}
	return TRUE;
}

Zasoby:

#include <windows.h>

#include "resource.h"

ID_DIALOG DIALOG 0, 0, 250, 60
STYLE DS_MODALFRAME | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP
CAPTION "bula"
FONT 8, "Ms Shell Dlg 2"
{
    DEFPUSHBUTTON   "Generate", IDOK, 185, 10, 55, 17
    PUSHBUTTON      "Cancel", IDCANCEL, 185, 35, 55, 16
    EDITTEXT        ID_NAME, 10, 8, 165, 20, ES_AUTOHSCROLL
    EDITTEXT        ID_SERIAL, 10, 33, 165, 20, ES_AUTOHSCROLL | ES_READONLY
}

Cala zabawa polega na tym, ze tworzysz sobie okienko dialogowe(modalne lub niemodalne), w tym przypadku modalne, za pomoca:
DialogBoxParamA lub DialogBoxA
Jak sam widzisz jako jeden z parametrow przyjmuje nazwe funkcji obslugujacej komunikaty okna.
Po poprawnym wykonaniu funkcji, zostaje utworzone okienko dialogowe i program w pewnym sensie sie zapetla, a jego sterowaniem zajmuje sie procedura DialogProc.
Zadaniem tej funkcji jest reakcja na komunikaty przesylane przez system do Twojego programu(uzytkownik cos nacisnie itp.). Argument uMsg zawiera kod komunikatu, czyli pewna liczbe, zdefiniowana w winuser.h, dzieki czemu mozemy na to odpowiednio zareagowac.
Kazda z tych liczb oczywiscie kryje sie pod pewna nazwa, jest to po prostu makro, typu #define WM_COMMAND 273. W przypadku najbardziej przydatnych komunikatow argument wParam zawiera identyfikator kontrolki zdefiniowany w pliku zasobow, pozwalajacy okreslic od ktorej kontrolki pochodzi zdarzenie. Argument lParam natomiast zawiera uchwyt tej kontrolki, a argument hwnd zawiera uchwyt okna dialogowego.
Tak to w skrocie wyglada w tym przypadku. Musisz sobie otworzyc MSDN i czytac jaki komunikat za co odpowiada oraz poznac kilka funkcji i bedziesz juz mogl bez problemu korzystac z dobrodziejstw okien dialogowych ;)

0

Juz nie do prostego crackme, bo nie wkleilem obslugi IDOK ;p

0

Już sobie to poskładałem do kupy i śmiga więc mogę sobie analizować :)
Ale mam taką nie zrozumiałą sytuację. Bo gdy coś zmienię w pliku *.rc to wyskakuje mi błąd podczas próby kompilowania, a jak kliknę znów żeby kompilowało to rzekomego błędu nie ma, a całość kompiluje się bez problemu.
Kod:

#include <windows.h>



LPSTR NazwaKlasy = "Klasa Okienka";

MSG msg;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DlgProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

//WYPEŁNIANIE STRUKTURY
 WNDCLASSEX wc;

 wc.cbSize = sizeof(WNDCLASSEX);
 wc.style = 0;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = NazwaKlasy;
 wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

//REJESTROWANIE KLASY OKNA
 if(!RegisterClassEx(&wc))
 {
  MessageBox(NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK);
   return 1;
 }

//TWORZENIE OKNA
 HWND hwnd;

 hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);
 HWND hPrzyc = CreateWindowEx(0, "BUTTON", "Dialog", WS_CHILD | WS_VISIBLE,
  5,5,50,25, hwnd, NULL, hInstance, NULL);
 if(hwnd==NULL)
 {
  MessageBox(NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION);
  return 1;
 }



 //Tworzymy jakiś przycisk do wywołania dialogu


 //Pokazujemy główne okno
 ShowWindow(hwnd, nCmdShow); //Pokaż okienko...
 UpdateWindow(hwnd);

 //No i standardowo - pętelka
 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return msg.wParam;
}

//Procedura okna
LRESULT CALLBACK WndProc(HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
 switch(mesg)
 {
  case WM_COMMAND:
  {
   //Tutaj wywołujemy nasz dialog
   int ret = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(200), hwnd, DlgProc);
   if(ret == IDOK)
    MessageBox(hwnd, "Wybrałeś 'Fajnie' w oknie dialogowym!", "Test", MB_ICONINFORMATION);
   else if(ret == IDCANCEL)
    MessageBox(hwnd, "Wybrałeś 'Anuluj' w oknie dialogowym!", "Test", MB_ICONINFORMATION);
  }
  break;
  case WM_DESTROY:
   PostQuitMessage(0);
  break;
  default:
   return DefWindowProc(hwnd, mesg, wParam, lParam);
 }

 return 0;
}

//Procedura dialogowa
BOOL CALLBACK DlgProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
 switch(Msg)
 {
  case WM_COMMAND:
  {
   //reakcja na przyciski
   switch(LOWORD(wParam))
   {
    case IDOK: EndDialog(hwnd, IDOK); break;
    case IDCANCEL: EndDialog(hwnd, IDCANCEL); break;
   }
  }
  break;
  default: return FALSE;
 }
 return TRUE;
}

Plik zasobów (BezNazwy1.rc):

#include <windows.h>
#include "dialog.h"

#define IDD_MOJDIALOG 200
#define IDC_LABEL 201
IDD_MOJDIALOG DIALOG DISCARDABLE 20, 20, 200, 66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Mójs własny dialog"
FONT 8, "MS Sans Serif"
{
 DEFPUSHBUTTON "&Fajnie!",IDOK,124,18,50,14
 PUSHBUTTON "&Anuluj",IDCANCEL,124,35,50,14
 LTEXT "To jest okno dialogowe",IDC_LABEL,16,18,80,33
}

Tu czepia się drugiej linii

Oraz otwiera plik:
Projekt1_private.rc i czepia się linii : #include "BezNazwy1.rc"

Jak wcześniej wspomniałem po ponownej próbie kompilowania problemów nie ma. Problem powtarza się gdy zmienię co kolwiek w pliku BezNazwy1.rc

O co może biegać ?

0

Nie dolacza sie include'm plikow zasobow. Jak masz MinGW to tak zrob:

windres plikzasobow.rc -o plikzasobow.o
gcc -c program.c -o program.o
gcc program.o plikzasobow.o -o program.exe -mwindows
0

Ale gafa nie było problemu już wiem ;p hehe tylko nie wiem czemu się pluło tylko nie wiem czemu się kompilowało za drugim podejściem

1 użytkowników online, w tym zalogowanych: 0, gości: 1