oracle dialog运行,win32窗口创建 之 CreateDialog和DialogBox

DialogBox

函数原型:

INT_PTR DialogBox( HINSTANCE hInstance,LPCTSTR

lpTemplate,

HWND hWndParent,DLGPROC lpDialogFunc);

函数功能:

这个函数根据对话框资源,创建一个模式对话框,这个对话框应该用EndDialog来结束。

参数:

hInstance 当前应用程序实例句柄。

lpTemplate

标识对话框模板资源,

有两种使用方式:一种是把对话框模板的ID强制转为LPCTSTR,

一种可以使用MAKEINTRESOURCE宏得到标识ID。

hWndParent 父窗口的句柄。

lpDialogFunc

对话框消息处理函数。

PS.模态对话框在掉起后,直到对话框结束才会继续原来的程序运行,因此如果在新对话框调起后还有操作,则要么用多线程,要么就用非模态对话框。

//模态对话框

CSplash 继承自 CDialog

CSplash dlg;

dlg.DoModal();

CreateDialog

函数原型:

HWND CreateDialog( HINSTANCE hInstance,LPCTSTR

lpTemplate,

HWND hWndParent,DLGPROC lpDialogFunc);

函数功能:

这个函数根据对话框资源,创建一个非模式对话框,这个对话框应该用DestroyWindow来结束。

参数:

函数的参数跟上面的DialogBox用法相同。

PS. 非模态对话框

//非模态

CSplash *

pDlg = new CSplash();

pDlg->Create(IDD_SPLASH,this);

pDlg->ShowWindow(SW_SHOW);

所谓的模态与非模态:

对话框一般分为两种类型:模态类型(modal)与非模态类型(modeless)。

所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换。

模式对话框一般是在栈中生成的,所以EndDialog可能只是隐藏窗口,并没有销毁,当模式对话框对应的对象离开生命区时即销毁对话框。非模式的对话框一般在堆中,所以要主动用DestroyWindow销毁它。

模态与非模态的消息处理:

DialogBox函数自己处理消息循环(这个消息循环在user32.dll里面维护,看不到)且在对话框关闭后函数才会返回(返回值是EndDialog的第二个参数,所以可以用EndDialog的第二个参数来标识子控件的ID),而CreateDialog函数调用了CreateWindowEx函数来创建窗口并立即返回,之后这个窗口使用主窗口的消息循环(即这个窗口产生的消息可能直接发给这个窗口的处理函数,也可能进入主窗口的消息循环)。

不管是模式的还是非模式的对话框,对于不希望处理的消息,都不应该调用DefWindowProc来处理(否则会有问题),因为系统会主动对这些消息进行处理。对于不希望处理的消息,程序要做的只是return

FALSE即可,而对于处理过的消息,则应该return TRUE。

这种情况跟主窗口的处理不同。主窗口对不希望处理的消息也要调用DefWindowProc来处理,而每个消息处理分支的返回值是无关紧要的(不像对话框那样一定要返回TRUE或FALSE那样)。

非模式对话框跟主窗口使用同一个消息循环,而因为非模式对话框的消息会被系统主动调用这个对话框的处理函数来处理,所以在消息循环中不应该再对这个消息进行转换和分发,可以把消息循环改成这样:

// 主消息循环:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable,

&msg))

{

//

不是非模式对话框g_hFlashWnd的消息才分发

if ( !IsDialogMessage(

g_hFlashWnd, &msg ) )

{

TranslateMessage(&msg);

DispatchMessage(&msg);

} }

}

CreateDialog会发出WM_INITDIALOG消息。

一些例子代码:

/// 非模式对话框消息处理函数

BOOL __stdcall FlashWndProc( HWND hWnd, UINT msg, WPARAM wParam,

LPARAM lParam )

{

switch ( msg )

{

case WM_INITDIALOG:

break;

case WM_PAINT:

break;

case WM_LBUTTONDOWN:

DestroyWindow( hWnd );

break;

default:

return FALSE; // 没处理过的消息

}

return TRUE; // 处理过的

}

///创建一个非模式对话框

g_hFlashWnd = CreateDialog( hInst,

MAKEINTRESOURCE(IDD_FLASH), hWnd, (DLGPROC)FlashWndProc );

ShowWindow( g_hFlashWnd, SW_SHOW );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值