程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Win32開發入門(14):用對話框作為主窗口

Win32開發入門(14):用對話框作為主窗口

編輯:關於C++

前面我們在編寫Win32應用程序的思路都是:

1、設計窗口類。2、注冊窗口類。3、創建窗口 。……

然而,當我們接觸控件以後, 會發現一個問題,我們在窗口上放置控件實在不好弄,而 資源中的對話框具有圖形編輯器,操作起來相對方便。

於是,就有了一個想法:把對話框用作 主窗口,那我們在布局控件時就輕松了。

其實這想法在網上已有牛人做了,不過,人家是用 Win32匯編干的,當然,要把它變為C++就更簡單了。

首先,介紹第一個法子,直接以桌面作為 父窗口來創建對話框。

1、創建一個對話框資源,界面就發揮你的設計天賦了。

2、創建 一個圖標資源,既作為應用程序的圖標(VS編譯時會選擇第一個添加到資源中的圖標作為EXE的圖標) ,也作為對話框的圖標。

3、在代碼中創建並顯示對話框。

#include <Windows.h>     
#include "resource.h"     
// 開啟可視化效果     
#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")     
         
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);     
         
HINSTANCE hgInst;     
int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)     
{     
    hgInst = hThisApp;     
    HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),

(DLGPROC)DlgProc);     
    if(!hdlg)     
    {     
        return 0;     
    }     
    ShowWindow(hdlg,SW_SHOW);     
    MSG msg;     
    while(GetMessage(&msg,NULL,0,0))     
    {     
        TranslateMessage(&msg);     
        DispatchMessage(&msg);     
    }     
    return 0;     
}     
         
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)     
{     
    switch(msg)     
    {     
    case WM_INITDIALOG:     
        // 設置對話框的圖標     
        SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, 

MAKEINTRESOURCE(IDI_APP)));     
        return 0;     
    case WM_SYSCOMMAND:     
        if(wParam == SC_CLOSE)     
        {     
            PostQuitMessage(0);//退出     
        }     
        return 0;     
    }     
    return (INT_PTR)FALSE;     
}

這樣,我們可以運行一下。

第二種方法,我們還是遵照設計窗口類、注冊窗口類、創建窗口等步驟,只是把對話框作為 窗口的子級,對話框采用Form View視圖。

在插入資源的對話框中,點擊Dialog左邊的圖標,展 開列表,在列表中選擇IDD_FORMVIEW,然後點“新建”。

然後你看到一個沒有邊框和標題欄的對話框。

接下來我們可以放些控件上去。

最後,在響應WM_CREATE消息時,創建並顯示對話框,父級是我們的主窗口。

case 

WM_CREATE:     
    {     
        // 創建對話框     
        HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)

DlgProc);     
        // 顯示對話框     
        ShowWindow(hdlg, SW_SHOWNA);     
    }     
    return 0;

最後運行結果如下:

完整的代碼清單:

#include <Windows.h>     
#include "resource.h"     
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")     
         
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);     
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);     
         
HINSTANCE hgAppInst;     
int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)     
{     
    // 設計窗口類     
    WNDCLASS wc = { };     
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;     
    wc.lpfnWndProc = (WNDPROC)WindowProc;     
    wc.lpszClassName = L"supper_man";     
    wc.hInstance = hThisApp;     
    wc.style = CS_HREDRAW | CS_VREDRAW;     
    RegisterClass(&wc);     
    hgAppInst = hThisApp;     
    // 創建窗口     
    HWND hwnd = CreateWindow(L"supper_man", L"超級應用",      
        WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL);     
    if(!hwnd)     
        return 0;     
    ShowWindow(hwnd, nShow);     
    UpdateWindow(hwnd);     
    // 消息循環     
    MSG msg;     
    while(GetMessage(&msg,NULL,0,0))     
    {     
        TranslateMessage(&msg);     
        DispatchMessage(&msg);     
    }     
    return 0;     
}     
         
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)     
{     
    switch (msg)     
    {     
    case WM_CREATE:     
        {     
            // 創建對話框     
            HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, 

(DLGPROC)DlgProc);     
            // 顯示對話框     
            ShowWindow(hdlg, SW_SHOWNA);     
        }     
        return 0;     
    case WM_DESTROY:     
        PostQuitMessage(0);     
        return 0;     
    default:     
        return DefWindowProc(hwnd,msg,wParam,lParam);     
    }     
    return 0;     
}     
         
// 處理對話框消息     
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)     
{     
    /* .............. */ 
    return (INT_PTR)FALSE;     
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved