ホームに戻る
 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);
}

inserted by FC2 system