Нужна помощь с пользовательским диалоговым окном..
Привет.. Я создал пользовательское диалоговое окно с сообщением и 2 кнопками
обычно для сообщения a quit сообщение "Да" закрывает приложение, но кнопка "нет" вместо закрытия диалогового окна либо закрывает приложение. Теперь это код:
#include <windows.h> #include <commctrl.h> #include <cstdio> #include <mmsystem.h> #include "resources.h" #define IDC_STATUS 50 #define ID_SYES 51 #define ID_SNO 52 /////////////////////// LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); //Global Variables///// //HWND HWND hMainWindow, hClose, hStaticClose, hStaticYes, hStaticNo, hStaticGroup; //HCURSOR HCURSOR gauntlet = (HCURSOR)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDC_SWORD), IMAGE_CURSOR, 32, 32, 0); //HBITMAP HBITMAP hBckground; //Close window (Dialog Box) loop LRESULT CALLBACK CloseWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_COMMAND: switch(wp) { case ID_SYES: { DestroyWindow(hWnd); break; } case ID_SNO: { EnableWindow(hMainWindow, true); SendMessage((HWND)hClose, WM_CLOSE, 0, 0); break; } } case WM_SETCURSOR: { SetCursor(gauntlet); return 1; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProcW(hWnd, msg, wp, lp); } return 0; } //Dialog Box///////////////// void registerCloseClass(HINSTANCE hInst) { WNDCLASSW close = {0}; close.hbrBackground = (HBRUSH)COLOR_WINDOW; close.hInstance = hInst; close.lpfnWndProc = CloseWndProc; close.lpszClassName = L"myCloseClass"; RegisterClassW(&close); } void displayClose(HWND hWnd) { hClose = CreateWindowW(L"myCloseClass", L"Warning !", WS_VISIBLE | WS_CAPTION, 555, 280, 280, 140, hWnd, NULL, NULL, NULL); EnableWindow(hWnd, false); hStaticClose = CreateWindowW(L"static", L"This will close the program. Are you sure ?", WS_CHILD | WS_VISIBLE | SS_CENTER, 37, 20, 200, 50, hClose, NULL, NULL, NULL); hStaticYes = CreateWindowW(L"button", L"Yes", WS_CHILD | WS_VISIBLE | BS_CENTER, 33, 70, 80, 25, hClose, (HMENU)ID_SYES, NULL, NULL); hStaticNo = CreateWindowW(L"button", L"No", WS_CHILD | WS_VISIBLE | BS_CENTER, 160, 70, 80, 25, hClose, (HMENU)ID_SNO, NULL, NULL); hStaticGroup = CreateWindowW(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 7, 0, 261, 107, hClose, NULL, NULL, NULL); } //Main Loop//////////// LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_PAINT: { BITMAP bm; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBckground); GetObject(hBckground, sizeof(bm), &bm); BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hdcMem); EndPaint(hWnd, &ps); } case WM_CREATE: { hBckground = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDC_MAINBMP)); // Create status bar HWND hStatus; int statwidths[] = {150, 450, -1}; hStatus = CreateWindowW(STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hWnd, (HMENU)IDC_STATUS, GetModuleHandle(NULL), NULL); SendMessageW(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths); SendMessageW(hStatus, SB_SETTEXT, 0, (LPARAM)" Author: Me"); SendMessageW(hStatus, SB_SETTEXT, 1, (LPARAM)" Ver. 1.00 "); SendMessageW(hStatus, SB_SETTEXT, 2, (LPARAM)" e-mail & other stuff"); } case WM_SETCURSOR: SetCursor(gauntlet); return 1; case WM_CLOSE: { PlaySound(MAKEINTRESOURCE(IDW_CLICK), NULL, SND_RESOURCE | SND_ASYNC); displayClose(hWnd); } break; case WM_DESTROY: DeleteObject(hBckground); PostQuitMessage(0); break; default: return DefWindowProcW(hWnd, msg, wp, lp); } return 0; } //SDI Creation////////////////// int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow) { InitCommonControls(); WNDCLASSW wc = {0}; wc.hbrBackground = (HBRUSH)COLOR_WINDOW + 1; wc.hIcon = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, 32, 32, 0); wc.hInstance = hInst; wc.lpfnWndProc = MainWndProc; wc.lpszClassName = L"myMainClass"; wc.style = 0; wc.lpszMenuName = MAKEINTRESOURCEW(IDR_MENU); if(!RegisterClassW(&wc)) return -1; registerCloseClass(hInst); hMainWindow = CreateWindowW(L"myMainClass", L"Application", WS_SYSMENU | WS_MINIMIZEBOX | WS_CAPTION, 300, 100, 800, 550, NULL, NULL, NULL, NULL); ShowWindow(hMainWindow, nCmdShow); UpdateWindow(hMainWindow); MSG msg = {0}; while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
У кого-нибудь есть идея, как это сделать ? Вероятно, некоторые из вас спросят, почему я просто не использовал системное диалоговое окно ... просто потому, что у меня есть пользовательский курсор, и когда я прохожу над диалоговым окном, он меняется на стандартный в системе.
Спасибо!
Что я уже пробовал:
Я попытался отправить сообщение в окно, в котором находится диалоговое окно и все другие элементы управления.
ID_SNO нажимается, но вместо этого нажатие кнопки No закрывает приложение отверстия.