学习MFC

来源:互联网 发布:apache bench windows 编辑:程序博客网 时间:2024/04/28 04:18

1、子窗口类中调用父窗口类中的成员函数:

CParentDlg *p;

p = (CParent *)GetParent();

p->func();


2、子窗口在关闭时通知父窗口刷新;

刷新工作交给父窗口自己做,在父窗口中:

{

     CFriendDlg dlg;

     dlg.domodal();

     refreshlist(); // 刷新好友列表

}


什么?子窗口是非模态窗口?那就发消息:

  1. 在父窗口中自定义消息#define WM_MSG WM_USER+0x01   

  2. 添加消息处理函数 LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)

  3. 加入消息映射ON_MESSAGE(WM_MSG, OnMyMessage)

  4. 在OnMyMessage中刷新好友

  5. 在子窗口中,给父窗口发消息SendMessage(GetParent(), WM_MSG, 0, 0)


3、改变窗口控件的颜色:

在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:
  afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
           参数nCtlColor用于指定控件的类型,可以是:
           .CTLCOLOR_BTN                按钮控件
           .CTLCOLOR_DLG                对话框
           .CTLCOLOR_EDIT               编辑框
           .CTLCOLOR_LISTBOX            列表控件
           .CTLCOLOR_MSGBOX             消息控件
           .CTLCOLOR_SCROLLBAR 滚动条控件
           .CTLCOLOR_STATIC             静态控件
[程序实现]
           假设你已有了名为My的对话框工程.你有了一个STATIC的控件,ID为IDC_STATIC1.
  HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
           {
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  
        // TODO: Change any attributes of the DC here
           if (nCtlColor==CTLCOLOR_STATIC)

              {
                    pDC->SetTextColor(RGB(255,0,0));  //字体颜色
                    pDC->SetBkColor(RGB(0, 0, 255));   //字体背景色  

                }
        // TODO: Return a different brush if the default is not desired
        return hbr;
           }


如果要指定某个特定控件可以这样写:ID为IDC_STATIC1

if (pWnd->GetDlgCtrlID()==IDC_STATIC1)
{
       pDC->SetTextColor(RGB(255,0,0));  //设置字体颜色
       pDC->SetBkMode(TRANSPARENT); //设置字体背景为透明
// TODO: Return a different brush if the default is not desired
  return (HBRUSH)::GetStockObject(BLACK_BRUSH);  // 设置背景色
}
else
return hbr;

【注】

BLACK_BRUSH:黑色

WHITE_BRUSH:白色

GRAY_BRUSH:灰色

NULL_BRUSH:透明

HOLLOW_BRUSH :透明


4、设置鼠标的状态:

//设置鼠标的形状,这里主要设置当鼠标在某些静态控件上是让鼠标形状变成手形
BOOL CMy14032501Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
// TODO: Add your message handler code here and/or call default
if (pWnd == GetDlgItem(IDC_STATIC_DEVELOP_LANGUAGE) || pWnd == GetDlgItem(IDC_STATIC_DEVELOP_ENVIRONMENT)
|| pWnd == GetDlgItem(IDC_STATIC_CODE_CLASSIFY))
{
HCURSOR hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); //加载手形光标
::SetCursor(hCursor);

return TRUE;
}

}


5、什么情况下才需要用ReleaseDC()来释放DC?

创建的DC都不需要,当且仅当你从window用GetDC之类的函数获得一个dc指针时才需要;


6、GDI对象的创建的释放:

 MFC类对象在析构时都会自动释放资源,不需要自己处理。只是当对象正在被使用的时候,例如对象被选入了某个DC中,此时对象是不能删除的,所以才会造成泄露。
  在使用SelectObject的时候,要保存其返回值,在用完之后再次调用SelectObject,选入上次的返回值。

0 0
原创粉丝点击