Monday, May 31, 2004

 

Some notes on Dialog

1.
如何只UpdateData一个对话框的某一个或几个(不是全部)控件的值

算是知识漏洞吧,还是jiangsheng提供的代码片断,原文节选如下

void CDlgSalesBatchDetail::DoDataExchange(CDataExchange* pDX)
{

CBCGDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgSalesBatchDetail)
DDX_Control(pDX, IDC_LIST_SPEC, m_listSpecCount);
//}}AFX_DATA_MAP

if(m_bUpdateAdoCombos)
{

DDX_Control(pDX, IDC_LIST, m_wndListPreview);
}

}

由于我自己写的DDX函数SalesHelper::DDX_AdoDataCombo可能比较慢(要查数据库),所以有时候不参与DDX,比如一个函数可能是这样

m_bUpdateAdoCombos=FALSE;
if(!UpdateData())
{
//更新数据
m_bUpdateAdoCombos=TRUE;
return;
}

//一个成员变量的值=另外两个成员变量的值之和
UpdateData(FALSE);
m_bUpdateAdoCombos=TRUE;//更新数据

整个过程和SalesHelper::DDX_AdoDataCombo关联的变量没有关系,就不用浪费时间去查数据库了。跑题一下,MSDN技术文章TN026: DDX and DDV Routines很不错的。

2.
如何在对话框中响应键盘按键

来源:VCKBASE

我们首先想到的是响应WM_KEYDOWN消息,但实际运行却发现没有任何效果。
原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先
处理回车,不至于回车使对话框关闭。
我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,
以下的代码实现了在对话框中显示虚拟键值(virtual-key code)
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
///或者直接调用OnKeyDown
CString strwParam;
strwParam.Format("%d ",pMsg->wParam);
CDC* pDC = GetDC();
pDC->TextOut(10,10,strwParam);
ReleaseDC(pDC);
}
return CDialog::PreTranslateMessage(pMsg);
}

此方法也适用于FORMVIEW或其它控件中对键盘按键的响应,以下的代码来自MSDN,
实现了当按下上下左右方向键时调用OnKeyDown,我们可以在OnKeyDown中作相应处理。

BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
BOOL bHandleNow = FALSE;
switch (lpmsg->message)
{
case WM_KEYDOWN:
switch (lpmsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
OnKeyDown(lpmsg->wParam, LOWORD(lpmsg ->lParam), HIWORD(lpmsg->lParam));
break;
}
return bHandleNow;
}

(按:其实这个方法还可以用于以下地方。把一个按钮设置为OWNER DRAW,你就无法再用ENTER键去CLICK这个按钮了。这应该是MICROSOFT的一个BUG。但是我们可以用类似上面的方法处理
BOOL CDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN)
{
if(GetFocus()==GetDlgItem(IDC_BUTTON1))
{
OnButon1();
return 1;
}
}
return CDialog::PreTranslateMessage(pMsg);
})



<< Home

This page is powered by Blogger. Isn't yours?