ホームに戻る
6、(コードサンプル)所有関係のポップアップウィンドウ
#include <windows.h>
#define WINDOW_CLASS_NAME "WinClassName"
#define WINDOW_NAME "WinName"
LRESULT CALLBACK PopupProc(HWND hPopup, UINT msg, WPARAM wparam, LPARAM lparam);
// ウィンドウクラスの登録
static bool RegisteredPopupClass = false;
static const char* ClassNamePopup="HPGUInmPopup";
static WNDCLASSEX PopupClassEx;
static void RegisterPopupClass() {
HINSTANCE hinst = GetModuleHandle(NULL);
WNDCLASSEX* wc = &PopupClassEx;
wc->cbSize = sizeof(WNDCLASSEX);
wc->style = CS_CLASSDC|CS_DBLCLKS;
wc->lpfnWndProc = PopupProc;
wc->cbClsExtra = 0L;
wc->cbWndExtra = 0L;
wc->hInstance = hinst;
wc->hIcon = LoadIcon(hinst, "MYICON");
wc->hCursor = LoadCursor(NULL, IDC_ARROW);
wc->hbrBackground = NULL;
wc->lpszMenuName = NULL;
wc->lpszClassName = ClassNamePopup;
wc->hIconSm = LoadIcon(hinst, MAKEINTRESOURCE(1));
RegisterClassEx(wc);
RegisteredPopupClass = true;
}
HWND createPopup(HWND hWnd){
HWND hPopup;
if(RegisteredPopupClass){
return NULL;
}
RegisterPopupClass();
hPopup = CreateWindowEx(
NULL,
ClassNamePopup, "",
WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE,
0, 0, 100, 50, hWnd, NULL,
GetModuleHandle(NULL), NULL);
return hPopup;
}
LRESULT CALLBACK PopupProc(HWND hPopup, UINT msg, WPARAM wparam, LPARAM lparam){
int id;
static int close_flag;
switch(msg){
case WM_CREATE:
close_flag = 0;
break;
case WM_NCACTIVATE:
if(close_flag == 0){
// 非アクティブになりそうになったら否定する
return FALSE;
}
break;
case WM_CLOSE:
close_flag = 1;
id = MessageBox(hPopup, TEXT("POPUP:CLOSE"), TEXT("WM_CLOSE"), MB_YESNO | MB_ICONQUESTION);
if(id == IDNO){
return 0;
}
break;
case WM_DESTROY:
close_flag = 1;
MessageBox(hPopup, TEXT("POPUP:DESTROY"), TEXT("WM_DESTROY"), MB_OK | MB_ICONINFORMATION);
break;
}
return DefWindowProc(hPopup, msg, wparam, lparam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
// Register Class
if(hPrevInst == NULL)
{
ZeroMemory(&wc, sizeof(wc));
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon((HINSTANCE)NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszClassName = WINDOW_CLASS_NAME;
if(RegisterClass(&wc) == 0){
return 0;
}
}
// CreateWindow
hWnd = CreateWindow(WINDOW_CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
(HWND)NULL, (HMENU)NULL, hInst, (LPVOID)NULL);
if(hWnd == NULL){
return 0;
}
// ShowWindow, UpdateWindow
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Message Loop
while(GetMessage(&msg, (HWND)NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
static HWND hChild;
switch(uMsg){
case WM_CREATE:
hChild = createPopup(hWnd);
return 0;
case WM_CLOSE:
if(IsWindow(hChild)){
DestroyWindow(hChild);
}
MessageBox(hWnd, TEXT("MAIN:CLOSE"), TEXT("WM_CLOSE"), MB_OK | MB_ICONINFORMATION);
break;
case WM_DESTROY:
MessageBox(hWnd, TEXT("MAIN:DESTROY"), TEXT("WM_DESTROY"), MB_OK | MB_ICONINFORMATION);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}