平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

高级窗口操作技巧

1.在函数中途弹出无模式对话框,之后马上进入挂起等待,导致对话框不被刷新,调用RedrawWindow可以使对话框即时同步被刷新。

 

2.设主窗口为CMainDialog,在其某函数中弹出模式对话框,该模式对话框将subclass override CMainDialog的窗口函数,并将收到的消息再转给CMainDialog,即,此时CMainDialog仍收到自己注册的消息如WM_TIMER等。
CMainDialog可在OnTimer中处理事件,Process网络消息等等,即,弹出模式对话框,不会导致消息处理和游戏循环的中止。在处理时,即从模式对话框外部,可以结束该对话框,操作对话框的显示内容。

3.限制文本框文字长度EM_LIMITTEXT

4.在窗口A上弹出一个模式对话框B,然后向A发WM_CLOSE,可能导致A关闭而B不关闭,此时在A的WM_CLOSE消息中显示调用DefWindowProc或DestroyWindow可解决

5.WTL下,有些消息设置了bHandled=false,但由于调用时机不对,导致默认的调用不起作用,采用显式调用解决。

6.主框架Frame隐藏时,其类中的MessageBox会有问题(Box的父隐藏),应该使用MessageBox(NULL, ...);否则后来弹出的对话框可能会在任务栏上不可见。

7.MessageBox,DialogBox中Window内部实现了一个消息泵,使得DoModal后程序仍然能接收线程消息,但程序对这个消息泵没有控制权,导致无法响应一些被默认实现的按键消息。

8.http://www.microsoft.com/mind/0499/faq/faq0499.asp
解决WebControl在对话框上按键失灵Bug.

9.重用一个控件子类化对象时,由于上次状态未清空,再次SubclassWindow后,表现时常,如WTL的CBItmapButton,加入状态清除函数。

10.DrawText的DT_WORDBREAK一定要配合DT_EDITCONTROL使用,否则就要**** ms了。

11.TBSTYLE_FLAT的工具栏,为透明背景,背景渲染混乱时子类化TOOLBAR并重载WM_ERASEBKGND消息画上背景.

12.RABAR的BAND的BAND_CLIENTEDGE规定了rabar的边框,竟然那么大.

13.重载Edit NcPaint导致输入汉字时,文字变没,刷新又好,没使用NULL_BRUSH的原因.另MSDN文档关于NcPaint严重错误.

14.非模式对话框的Tab键失效,需要做
 virtual BOOL PreTranslateMessage(MSG* pMsg)
 {
      return CWindow::IsDialogMessage(pMsg);
 }

 CMessageLoop* pLoop = _Module.GetMessageLoop();
 pLoop->AddMessageFilter(this);
Refer to MSDN: Dialog Box Programming Considerations

15.Shell dll必须使用Apartment线程模式,否则出错.
16.WTL 程序去除 AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); 后在某些XP操作系统下,Windows窗口创建失败,而程序Windows窗口根本没有使用扩展Windows控件.

17.wndMain.CreateEx(NULL, NULL, WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE)模式的窗口销毁Close后不能自己发送WM_QUIT消息,需要程序手动发送::PostQuitMessage(0);

18.    When using WTL 7.0 with ActiveX controls under ATL 7.1, the framework will ASSERT inside atlcom.h on the following line:
    ATLASSERT(!InlineIsEqualGUID(*m_plibid,GUID_NULL) && "Did you forget to pass the LIBID to CComModule::Init?");

    This can be solved one of two ways:
    1) Change your "Use of ATL" setting to "Dynamic Link to ATL" in your project properties.
    2) Change your "Use of ATL" setting to "Static Link to ATL" and instead of using
       hRes = _Module.Init(NULL, hInstance);
       line in your _tWinMain, use this instead:
GUID guid;
hRes = _Module.Init(NULL, hInstance, &guid);

The ATLASSERT is apparently a bug in ATL 7.0/7.1 because everything works right if you pass a non-null GUID to _Module.Init(). Note that some people prefer to pass the actual LIBID instead of a garbage GUID, but this has no effect on whether the framework works correctly or not.

Refered from: http://userpages.umbc.edu/%7Ebcorfm1/wtl.html

19.Edit或RichEdit滚动到最后一行,m_edit.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), 0);

posted on 2005-08-13 17:19 linghuye 阅读(862) 评论(0)  编辑 收藏 引用 所属分类: 编程札记

只有注册用户登录后才能发表评论。