对话框控件和对话框的绑定

[align=center][size=large]对话框控件和对话框的绑定[/size][/align]

基于Windows SDK建立对话框和一些常用控件,问题:
1)对话框的创建?
2)对话框的控件如何初始化?
3)对话框的控件如何绑定到对话框窗口?


一、对话框的创建

对话框分为模态对话框和非模态对话框,这俩者的区别许多资料里都有详细的说明。

模态对话框获得输入焦点后之道点击OK或者Cancel后才会把焦点释放,在模态对话框设置期间其他程序不能获得焦点,这样的好处是达到了利用对话框和用户交流的目的。非模态对话框的例子就是当用notepad编辑文档,当要关闭时会弹出一个对话框提示是否要保存,这个对话框就是一个典型的模态对话框。

非模态对话框调用之后立即返回,并不持续占用输入焦点,那么可以同时开多个非模态对话框。

创建埋汰对话框与船舰窗口的区别:
创建模态对话框并不像窗口的创建:注册->创建->显示->窗口处理函数这个流程,对话框的模板系统已经注册好了,我们直接创建就可以。关键是创建了对话框之后的回调函数如何处理,怎么绑定回调函数?

创建模态对话框的API函数:
(1)DialogBox:
INT_PTR DialogBox( HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);

这个函数根据系统对话框模板创建一个模态对话框,其中参数的含义如下:
hlnstance:标识一个模块的事例该模块的可执行文件含有对话框模板。   IpTemplate:标识对话框模板。此参数可以是指向一个以NULL结尾的字符串的指针,该字符串指定对话框模板名,或是指定对话框模板的资源标识符中的一个整型值。如果此参数指定了一个资源标识符则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE宏指令创建此值。   hWndParent:指定拥有对话框的窗口。   IpDialogFunc:指向对话框过程的指针。有关更详细的关于对话框过程的信息,请参见DialogProc

(2)DialogBoxParam
INT_PTR DialogBoxParam( HINSTANCE hInstance,
LPCTSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);
该函数和DialogBxo相似,只是多了一个最后的参数,用来传递信息。

这两个函数都是通过CreateWindowEx来创建对话框的,而CreateWindowEx是CreateWindow的另外一个函数,高级函数,是微软后来封装的。

(3)CreateDialog 创建非模态对话框
HWND CreateDialog( HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
The CreateDialog macro creates a modeless dialog box from a dialog box template resource. The CreateDialog macro uses the CreateDialogParam function
(4)CreateDialogParam 创建非模态对话框
HWND CreateDialogParam( HINSTANCE hInstance,
LPCTSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);
这些函数调用后会发送WM_INITDIALOG消息来初始化对话框,这个消息由系统派遣到对话框回调函数进行处理。

比如:
下面的代码是用CreateWindowEx创建一个对话框

// CreateDialog.cpp : Defines the entry point for the application.
//
#include <Windows.h>
#define MAX_LOADSTRING 100

// Global Variables:
static TCHAR szTitle[MAX_LOADSTRING] = TEXT("Test"); // The title bar text
WNDPROC hWndProc;
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: Place code here.
MSG msg;
//HACCEL hAccelTable;
// Perform application initialization:
HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW, TEXT("#32770"), szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
//Set callback function
hWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)(WNDPROC)WindowProc);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int) msg.wParam;
}

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
return 0;

case WM_DESTROY:
PostQuitMessage (0);
break;

default:
return CallWindowProc(hWndProc, hWnd, uMsg, wParam, lParam);
}
return 0;
}

输出结果是建立一个空的模态对话框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值