2007-10-28

VC notes[01]

许久没用Win了,生疏了很多。记些笔记:

  1. 让Dialog中能接收 WM_CHAR,及按键时不要“咚咚”声

  2. 在 Dialog::PreTranslateMessage(MSG* pMsg) 中让Dialog跳过WM_CHAR的处理(return FALSE):
    if (pMsg->message == WM_KEYDOWN 
          || pMsg->message == WM_KEYUP 
          || pMsg->message == WM_CHAR)
        return FALSE; // 解决按键时的“咚咚”声,及让Dialog中能接收 WM_CHAR
    //(Dialog 的回车自动 OK,ESC 自动 CANCEL 也可以用这种方式解决)

  3. 在某窗体中禁用输入法:(标准 Windowz GUI 中控件也是窗体)
    处理 WM_INPUTLANGCHANGEREQUEST 并 return 0;
  4. 自绘输入光标
    WM_SETFOCUS:
    // 注:这里我开始用this->CreateCaret(NULL),发现只有个小黑点,所以用可以定义大小的。
    ::CreateCaret(this->m_hWnd, NULL, 2, 25);//(HBITMAP)1是灰块,NULL是黑块,也可以定制BMP
    ::SetCaretPos(50,15);    // 设置光标位置
    this->ShowCaret();
     
    WM_KILLFOCUS:
     
    this->HideCaret();
    ::DestroyCaret();
  5. 动态设置光标位置
    结合如下API:(注意:DC的字体)
    SIZE    size;    // 字串高度、宽度
    GetTextExtentexPoint32(hdc, str, strlen, &size);
  6. 限制窗口显示的大小
    (注:该消息为Win发送处理,用户只需设置其值就行了,只设置需要的其它的交给系统调整)
    WM_GETMINMAXINFO: 
     
    // 窗口最小能调整到的大小
    lpMinMaxInfo->ptMinTrackSize.x = 640;
    lpMinMaxInfo->ptMinTrackSize.y = 480;
    // 窗口最大能调整到的大小
    lpMinMaxInfo->ptMaxTrackSize.x = 800;
    lpMinMaxInfo->ptMaxTrackSize.y = 600;
    // 最大化窗口时的大小
    lpMinMaxInfo->ptMaxSize.x = 800;
    lpMinMaxInfo->ptMaxSize.y = 600;
    // 最大化窗口时的位置
    lpMinMaxInfo->ptMaxPosition.x = 50;
    lpMinMaxInfo->ptMaxPosition.y = 60;
     
    return 0; // 自己处理后要 return 0;


//EOF

0 comments: