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;
}