使用DialogBox建立Windows程式

來源:互聯網
上載者:User

使用DialogBox建立Windows程式

一般的使用SDK編寫的WIN32程式(使用WinMain和WindProc進行訊息處理),
產生的EXE檔案都比較小,但是也會存在不足,即建立的視窗,介面的控制項布局比較麻煩。
為此可以使用資源的方法解決視窗布局麻煩的問題,即在資源檔裡面建好視窗和菜單,
然後再調用DiaglogBox函數建立Windows視窗,再在DLGPROC裡面處理Window訊息。

函式宣告如下:
int DialogBox(
  HINSTANCE hInstance,
  LPCTSTR lpTemplate,
  HWND hWndParent,
  DLGPROC lpDialogFunc
);
HINSTANCE hInstance:為資源控制代碼
LPCTSTR lpTemplate:指向需要建立的視窗模板的長指標,可用MAKEINTRESOURCE來通過視窗ID擷取
HWND hWndParent:父視窗控制代碼
DLGPROC lpDialogFunc:視窗的訊息處理函數

視窗訊息處理的回呼函數定義如下:
BOOL CALLBACK DialogProc(
  HWND hwndDlg,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
);
這裡,如果返回為TRUE則表示訊息已經處理完了,如果是FALSE,表示還沒處理好,系統會根據訊息類型,
進行預設的處理。

調用DialogBox的時候,會建立資源裡面的視窗,建立完後即進入所建立視窗的訊息迴圈函數裡面,
直到調用EndDialog()函數返回的時候,才會返回DialogBox函數。

注意,當使用SHCreateMenuBar的時候,如果建立的菜單是資源檔裡面的,必須設定SHMENUBARINFO中
的dwFlags為SHCMBF_HMENU!

 

 

 #include <windows.h><br />#include <aygshell.h><br />#include "resource.h"<br />//////////////////////////////////////////////////////////////////////////<br />#pragma comment(lib, "aygshell.lib")<br />//////////////////////////////////////////////////////////////////////////<br />HWNDg_hWnd;<br />HINSTANCEg_hInst;<br />//////////////////////////////////////////////////////////////////////////<br />BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg,<br /> WPARAM wParam, LPARAM lParam);<br />BOOL InitWindow(const HWND hDlg, UINT nToolBarId);<br />//////////////////////////////////////////////////////////////////////////<br />#define WND_TITLE_T("ResDialog")<br />//////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////<br />int APIENTRY WinMain(HINSTANCE hInstance,<br /> HINSTANCE hPrevInstance,<br /> LPWSTR lpCmdLine,<br /> int nShowCmd)<br />{<br />int nResult;<br />HANDLE hMutex;</p><p>hMutex = CreateEvent(NULL, FALSE, FALSE, _T("_PROGRAM_ONLY_ONE_INSTANCE_"));<br />if (hMutex != NULL)<br />{<br />if (GetLastError() == ERROR_ALREADY_EXISTS)<br />{<br />HWND hWnd;<br />hWnd = FindWindow(NULL, WND_TITLE);<br />if (hWnd != NULL)<br />{<br />SetForegroundWindow((HWND)((ULONG)hWnd | 0x00000001));<br />}<br />}<br />else<br />{<br />g_hInst = hInstance;<br />nResult = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1),<br />NULL, (DLGPROC)DialogProc);<br />nResult = GetLastError();<br />}</p><p>CloseHandle(hMutex);<br />}</p><p>return (nResult>=0);<br />}<br />//////////////////////////////////////////////////////////////////////////<br />BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg,<br /> WPARAM wParam, LPARAM lParam)<br />{<br />BOOL fReturn = TRUE;</p><p>switch(uMsg)<br />{<br />case WM_INITDIALOG:<br />if (!InitWindow(hDlg, IDR_MENU1))<br />EndDialog(hDlg, -1);// Exit cause error<br />break;<br />case WM_COMMAND:<br />switch(wParam)<br />{<br />case IDM_QUIT:<br />EndDialog(hDlg, IDOK);<br />break;<br />}<br />break;<br />case WM_DESTROY:<br />break;<br />default:<br />fReturn = FALSE;<br />}<br />return fReturn;<br />}<br />//////////////////////////////////////////////////////////////////////////<br />BOOL InitWindow(const HWND hDlg, UINT nToolBarId)<br />{<br />// Specify that the dialog box should stretch full screen<br />SHINITDLGINFO shidi;<br />ZeroMemory(&shidi, sizeof(shidi));<br />shidi.dwMask = SHIDIM_FLAGS;<br />shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN;<br />shidi.hDlg = hDlg;</p><p>// set up Soft Keys menu<br />SHMENUBARINFO mbi;<br />ZeroMemory(&mbi, sizeof(SHMENUBARINFO));<br />mbi.cbSize = sizeof(SHMENUBARINFO);<br />mbi.hwndParent = hDlg;<br />mbi.dwFlags = SHCMBF_HMENU;<br />mbi.nToolBarId = nToolBarId;<br />mbi.hInstRes = g_hInst;</p><p>// If we could not initialize the dialog box, return an error<br />if (FALSE == (SHInitDialog(&shidi) && SHCreateMenuBar(&mbi)))<br />{<br />return FALSE;<br />}</p><p>// set the title bar<br />SetWindowText(hDlg, WND_TITLE);</p><p>return TRUE;<br />}</p><p>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.