方法一(成功):
HBRUSH COptionsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor == CTLCOLOR_STATIC)
{
                  //用下面GetDlgCtrlID比较,能够成功改变STATIC背景颜色
if (pWnd->GetDlgCtrlID() == IDC_STATIC_BACKCOLOR) {
HBRUSH brush=CreateSolidBrush(m_nBackColor);
pWnd->GetDC()->SetBkColor(m_nBackColor);
return brush;
}
    
}
return hbr;
}方法二(失败):HBRUSH COptionsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor == CTLCOLOR_STATIC)
{
                  //用下面GetDlgItem比较,没有进入IF模块
if (pWnd == GetDlgItem(IDC_STATIC_BACKCOLOR)) {
HBRUSH brush=CreateSolidBrush(m_nBackColor);
pWnd->GetDC()->SetBkColor(m_nBackColor);
return brush;
}
    
}
return hbr;
}难道
    
   如果pWnd->GetDlgCtrlID() == IDC_STATIC_BACKCOLOR相等的话,
   pWnd 和 GetDlgItem(IDC_STATIC_BACKCOLOR)回不相等?请问为什么?

解决方案 »

  1.   

    pWnd是对话框的句柄不是IDC_STATIC_BACKCOLOR的句柄!
      

  2.   

    那这个 pWnd->GetDlgCtrlID() == IDC_STATIC_BACKCOLOR何解?
      

  3.   

    那这个 pWnd->GetDlgCtrlID() == IDC_STATIC_BACKCOLOR何解?
      

  4.   

    抱歉!说错了,应该是:
    GetDlgItem(IDC_STATIC_BACKCOLOR)是取当前窗口中的子控制IDC_STATIC_BACKCOLOR的句柄,如果pWnd是对话框句柄,那么GetDlgItem(IDC_STATIC_BACKCOLOR)就是背景的句柄;如果pWnd是背景句柄,那么GetDlgItem(IDC_STATIC_BACKCOLOR)就是背景的子控制句柄。懂了吗?
      

  5.   

    我考!有什么不同吗?知道它的意义不就行了?
    SDK下是句柄
    MFC下是指针这下行了吧?
      

  6.   

    楼上说的不对。GetDlgItem返回的总是指定的对话框控件的指针,这个指针是指向一个临时对象的。要注意的是,控件虽然只有一个,但用来表示它的类的对象可以有很多个。所以pWnd的值与GetDlgItem的返回值不同是容易理解的。