0x7_對話方塊

HK丶騷皮龍發表於2020-10-12

對話方塊簡介

通過CreateWindow建立視窗,比較複雜。於是微軟提供了直接建立對話方塊的方式。

  • 1、通過資源編輯器新增對話方塊資源,編輯ID
  • 2、使用CreateDialog或DialogBox函式建立對話方塊
// 函式原型
HWND CreateDialog(  
  HINSTANCE hInstance,  // handle to module
  LPCTSTR lpTemplate,   // dialog box template name
  HWND hWndParent,      // handle to owner window
  DLGPROC lpDialogFunc  // dialog box procedure
  );
INT_PTR DialogBox(  
  HINSTANCE hInstance,  // handle to module
  LPCTSTR lpTemplate,   // dialog box template
  HWND hWndParent,      // handle to owner window
  DLGPROC lpDialogFunc  // dialog box procedure
  );
  • 模態和非模態的區別
  • 1、 CreateDialog建立的是非模態的對話方塊(不會阻塞父視窗)
  • 2、 DialogBox建立的是模態對話方塊(會阻塞父視窗)
  • 3、 非模態對話方塊需要直接編寫訊息迴圈,模態對話方塊自帶訊息迴圈
  • 4、 退出訊息迴圈用EndDialog

對話方塊和視窗的區別

-視窗對話方塊
函式返回值返回LRESULT返回BOOL
訊息處理不處理WM_INITDIALOG不處理WM_CREATE,WM_DESTORY,WM_PAINT
不處理訊息的處理return DefWindowProcreturn 0

對話方塊處理的主要訊息

WM_INITDIALOG初始化對話方塊
WM_COMMAND響應對話方塊上常用控制元件的操作
WM_NOTIFY響應對話方塊複雜控制元件的操作

模態對話方塊的編寫

#include <windows.h>
#include <tchar.h>
#include "resource.h"

int WINAPI _tWinMain(_In_ HINSTANCE hInstance, 
_In_opt_ HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine, 
 _In_ int nShowCmd
 )
{
  g_hInstance = hInstance;
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
  return 0;
}

INT_PTR CALLBACK DlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  switch (Message)
  {
  case WM_CLOSE:
    EndDialog(hWnd, 0);
    //PostQuitMessage(EXIT_SUCCESS);
    break;
  default:
    break;
 }
    return 0;
}
  • 1、建立對話方塊資源
  • 2、顯示呼叫DialogBox對話方塊
  • 3、編寫對話方塊訊息處理函式
  • 4、關閉對話方塊函式

資訊框

資訊框是模態對話方塊的一種特殊形式

函式原型:
int MessageBox(  
  HWND hWnd,          // handle to owner window
  LPCTSTR lpText,     // text in message box
  LPCTSTR lpCaption,  // message box title
  UINT uType          // message box style
  );
標識描述
MB_ABORTRETRYIGNORE訊息框包含三個按鈕:Abort、重試和忽略。
MB_ICONEXCLAMATION感嘆號點圖示出現在訊息框中。
MB_ICONQUESTION一個問號圖示出現在訊息框中。
MB_ICONSTOP一個停止標誌圖示出現在訊息框中
MB_OK訊息框包含一個按鈕:OK。這是預設值
MB_OKCANCEL訊息框包含兩個按鈕:OK和Cancel。
MB_RETRYCANCEL訊息框包含兩個按鈕:重試和取消。
MB_YESNOYES NO
MB_YESNOCANCEL訊息框包含三個按鈕:是、否和取消

返回值

返回值|使用者操作
IDABORT|按下 Abort
IDCANCEL|按下Cancel
IDIGNORE|按下Ignore
IDNO|按下NO
IDOK|按下OK
IDRETRY|按下Retry
IDYES|按下YES


非模態對話方塊

#include <windows.h>
#include <tchar.h>
#include "resource.h"
HINSTANCE g_hInstance = NULL;


int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd)
{
   g_hInstance = hInstance;
   HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
   AnimateWindow(hWnd, 200, AW_CENTER);
   ShowWindow(hWnd, SW_SHOW);

   MSG msg;
   while (GetMessage(&msg, 0, 0, 0))
   {
     DispatchMessage(&msg);
   }
  return 0;
}

INT_PTR CALLBACK DlgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  switch (Message)
  {
  case WM_CLOSE:
    //EndDialog(hWnd, 0);
    PostQuitMessage(EXIT_SUCCESS);
    break;
  default:
    break;
  }
  return 0;
}

相關文章