Poprawa kodu (WinAPI)


(Marcinch7) #1

Hej, ostatnio zacząłem swoją przygodę z WinAPI i napisałem swój pierwszy program w nim. Napisałem go bazując na wiedzy z wielu kursów i z MSDN'u, gdzie każdy podawał inne sposoby na zrobienie danej rzeczy, więc moją prośbą jest to, żebyście obejrzeli mój kod i powiedzieli mi czy jest poprawny, a jeśli są w nim jakieś błędy to abyście mnie o nich poinformowali (być może gdzieś nie zwalniam pamięci, a coś można zrobić lepiej), zarzucam kod:

#include 

#include 

#include 

#include 


#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#define CREATE_WND(handle,clss,title,style,w,h) handle=CreateWindow(clss,title,style,(GetSystemMetrics(SM_CXSCREEN)-w)/2,(GetSystemMetrics(SM_CYSCREEN)-h)/2,w,h,0,0,*hInst,0);

#define CREATE_CTRL(handle,ctrl,title,style,exstyle,x,y,w,h,id) handle=CreateWindowEx(exstyle,ctrl,title,style,x,y,w,h,hWnd,(HMENU)id,*hInst,0);\

SendMessage(handle,WM_SETFONT,17432631,0);


CHAR className[]="ErrorGenerator";

CHAR appName[]="Error Generator v2.0";


HINSTANCE *hInst;

HWND hWnd;


HWND label_title,label_text,label_buttons,label_icon;

HWND button_generate,button_about,button_loop;

HWND edit_title,edit_text;

HWND combo_buttons,combo_icon;


std::string GetText(HWND handle)

{

	char *buff=new char[GetWindowTextLength(handle)];

	GetWindowText(handle,buff,GetWindowTextLength(handle)+1);

	std::string tmp=buff;

	return tmp;

}


LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

{ 

	switch(uMsg)

	{

		case WM_CREATE:

			CREATE_CTRL(label_title,WC_STATIC,"Tytuł okna:",WS_CHILD|WS_VISIBLE,0,12,15,62,13,0);

			CREATE_CTRL(label_text,WC_STATIC,"Treść błędu:",WS_CHILD|WS_VISIBLE,0,12,41,68,13,0);

			CREATE_CTRL(label_buttons,WC_STATIC,"Przyciski onka:",WS_CHILD|WS_VISIBLE,0,12,67,78,13,0);

			CREATE_CTRL(label_icon,WC_STATIC,"Ikona okna:",WS_CHILD|WS_VISIBLE,0,12,94,64,13,0);

			CREATE_CTRL(button_generate,WC_BUTTON,"Wygeneruj błąd!",WS_CHILD|WS_VISIBLE,0,12,141,122,31,1);

			CREATE_CTRL(button_about,WC_BUTTON,"O programie...",WS_CHILD|WS_VISIBLE,0,141,141,122,31,2);

			CREATE_CTRL(button_loop,WC_BUTTON,"Nieskończona pętla błędów",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,0,15,118,159,17,0);

			CREATE_CTRL(edit_title,WC_EDIT,0,WS_CHILD|WS_VISIBLE,WS_EX_CLIENTEDGE,80,12,182,20,0);

			CREATE_CTRL(edit_text,WC_EDIT,0,WS_CHILD|WS_VISIBLE,WS_EX_CLIENTEDGE,86,38,176,20,0);

			CREATE_CTRL(combo_buttons,WC_COMBOBOX,0,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,WS_EX_CLIENTEDGE,96,64,166,21,0);

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"Tylko OK");

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"OK i Anuluj");

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"Tak i Nie");

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"Tak, Nie i Anuluj");

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"Ponów i Anuluj");

			SendMessage(combo_buttons,CB_ADDSTRING,0,(LPARAM)"Przerwij, Ponów i Ignoruj");

			CREATE_CTRL(combo_icon,WC_COMBOBOX,0,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,WS_EX_CLIENTEDGE,82,91,180,21,0);

			SendMessage(combo_icon,CB_ADDSTRING,0,(LPARAM)"Informacja");

			SendMessage(combo_icon,CB_ADDSTRING,0,(LPARAM)"Pytanie");

			SendMessage(combo_icon,CB_ADDSTRING,0,(LPARAM)"Ostrzeżenie");

			SendMessage(combo_icon,CB_ADDSTRING,0,(LPARAM)"Błąd");

		break;


		case WM_COMMAND:

			if(wParam==1)

			{

				std::string title=GetText(edit_title);

				std::string text=GetText(edit_text);

				short buttons=(short)SendMessage(combo_buttons,CB_GETCURSEL,0,0);

				short icon=(short)SendMessage(combo_icon,CB_GETCURSEL,0,0);

				if(title=="") MessageBox(hWnd,"Wpisz tytuł okna!",appName,MB_ICONERROR);

				else if(text=="") MessageBox(hWnd,"Wpisz treść błędu!",appName,MB_ICONERROR);

				else if(buttons==-1) MessageBox(hWnd,"Wybierz przyciski okna!",appName,MB_ICONERROR);

				else if(icon==-1) MessageBox(hWnd,"Wybierz ikonę okna!",appName,MB_ICONERROR);

				else

				{

					char buffer[MAX_PATH]="";

					OPENFILENAME ofn;

					ZeroMemory(&ofn,sizeof(ofn));

					ofn.lStructSize=sizeof(OPENFILENAME);

					ofn.hwndOwner=hWnd;

					ofn.lpstrFilter="Skrypty Visual Basic (*.vbs)\0*.vbs\0Wszystkie pliki (*.*)\0*.*\0";

					ofn.lpstrFile=buffer;

					ofn.nMaxFile=MAX_PATH;

					ofn.lpstrDefExt="vbs";

					if(GetSaveFileName(&ofn))

					{

						if(buttons==2) buttons=4;

						else if(buttons==4) buttons=5;

						else if(buttons==5) buttons=2;


						if(icon==0) icon=64;

						else if(icon==1) icon=32;

						else if(icon==2) icon=48;

						else if(icon==3) icon=16;


						std::ofstream save(buffer);

						if(SendMessage(button_loop,BM_GETCHECK,0,0)) save<<"Do"<
						save<<"MsgBox \""<
						if(SendMessage(button_loop,BM_GETCHECK,0,0)) save<
						save.close();


						MessageBox(hWnd,"Zapisano plik błędu!",appName,MB_ICONINFORMATION);

					}

					else MessageBox(hWnd,"Anulowano zapisywanie...",appName,MB_ICONERROR);

				}

			}

			if(wParam==2) MessageBox(hWnd,"Program stworzył marcin1147 w celach edukacyjnych!",appName,MB_ICONINFORMATION);

		break;


		case WM_DESTROY: PostQuitMessage(0);

		default: return DefWindowProc(hWnd,uMsg,wParam,lParam);

	} 

	return 0;

} 


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

	hInst=&hInstance;

	WNDCLASS wndclass;

	ZeroMemory(&wndclass,sizeof(wndclass));

	wndclass.lpfnWndProc=WndProc;

	wndclass.hInstance=*hInst;

	wndclass.hCursor=LoadCursor(0,IDC_ARROW);

	wndclass.hbrBackground=(HBRUSH)COLOR_WINDOW;

	wndclass.lpszClassName=className;


	if(!RegisterClass(&wndclass)) return 0;

	CREATE_WND(hWnd,className,appName,WS_SYSMENU,280,212);

	if(!hWnd) return 0; 


	ShowWindow(hWnd,SW_SHOW);

	MSG msg;

	while(GetMessage(&msg,0,0,0))

	{

		TranslateMessage(&msg);

		DispatchMessage(&msg);

	}


	return (int)msg.wParam;

}