我在对话框上加了4个自绘按钮,
当对话框第一次显示的时候它们都
不显示的.
当我点击他们就正常了.
请问怎么半啊?

解决方案 »

  1.   

    还有,调用按钮的invalidate不管用啊!!
      

  2.   

    这是button的代码:
    // CPCButtonIMPLEMENT_DYNAMIC(CPCButton, CButton)
    CPCButton::CPCButton()
    {
    UseBitmap=false;
    }CPCButton::~CPCButton()
    {
    }
    BEGIN_MESSAGE_MAP(CPCButton, CButton)
    ON_WM_PAINT()
    END_MESSAGE_MAP()// CPCButton 消息处理程序
    void CPCButton::LoadBitmap(CString name)
    {
    HBITMAP h;
    h=(HBITMAP)LoadImage(NULL,name,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if(h==NULL)
    {
    MessageBox(name+"load "+" failed");
    //exit(1);
    return ;
    }
    else
    bitmap.Attach(h);
    UseBitmap=true;
    }void CPCButton::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CButton::OnPaint()
    CRect rect;
    GetClientRect();
    if(UseBitmap)
    {
    CDC doc;
    if(!doc.CreateCompatibleDC(&dc))
    return ;
    BITMAP bmp;
    bitmap.GetBitmap(&bmp);
    doc.SelectObject(&bitmap);

    dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&doc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    }
    else
    {
    CBrush *old=dc.SelectObject(&brush);
    dc.FillRect(&rect,&brush);
    dc.SelectObject(old);
    }
    int nOldMode;nOldMode= dc.SetBkMode(TRANSPARENT);
    CString text;
    GetWindowText(text);
    CFont font;
    font.CreatePointFont(1,"宋体",&dc);
    CFont *of=dc.SelectObject(&font);
    //rc.DeflateRect(2,2,2,2);
    dc.DrawText(text, &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    dc.SelectObject(of);
    dc.SetBkMode(nOldMode);

    }void CPCButton::SetColor(COLORREF c)
    {
    color=c;
    brush.CreateSolidBrush(color);
    UseBitmap=false;
    }void CPCButton::PreSubclassWindow()
    {
    // TODO: 在此添加专用代码和/或调用基类
    ModifyStyle(0,BS_OWNERDRAW);
    CButton::PreSubclassWindow();
    }void CPCButton::DrawItem(LPDRAWITEMSTRUCT lp)
    { // TODO:  添加您的代码以绘制指定项
    CDC dc;
    dc.Attach(lp->hDC);
    CRect rect=lp->rcItem;

    if(UseBitmap)
    {
    CDC doc;
    if(!doc.CreateCompatibleDC(&dc))
    return ;
    BITMAP bmp;
    bitmap.GetBitmap(&bmp);
    doc.SelectObject(&bitmap);

    dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&doc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    }
    else
    {
    CBrush *old=dc.SelectObject(&brush);
    dc.FillRect(&rect,&brush);
    dc.SelectObject(old);
    }
    int nOldMode;nOldMode= dc.SetBkMode(TRANSPARENT);
    CString text;
    GetWindowText(text);
    CFont font;
    font.CreatePointFont(1,"宋体",&dc);
    CFont *of=dc.SelectObject(&font);
    //rc.DeflateRect(2,2,2,2);
    dc.DrawText(text, &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    dc.SelectObject(of);
    dc.SetBkMode(nOldMode);
    if(lp->itemState&ODS_SELECTED)
    {
    dc.Draw3dRect(&rect,GetSysColor(COLOR_3DDKSHADOW),
                GetSysColor(COLOR_3DHILIGHT));
    }
    else
    {
    dc.Draw3dRect(&rect,GetSysColor(COLOR_3DHILIGHT),
                GetSysColor(COLOR_3DDKSHADOW));
    }
    }
      

  3.   

    onPaint的代码是实在无奈才加上去的.
    这是dlg的代码:// CLoginDlg 对话框IMPLEMENT_DYNAMIC(CLoginDlg, CDialog)
    CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CLoginDlg::IDD, pParent)
    {
    }CLoginDlg::~CLoginDlg()
    {
    }void CLoginDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_STATIC3, QQnumber);
    DDX_Control(pDX, IDC_STATIC2, QQpassword);
    DDX_Control(pDX, IDC_STATIC1, QQmode);
    DDX_Control(pDX, IDC_BUTTON1, SetIT);
    DDX_Control(pDX, IDC_BUTTON2, Login);
    DDX_Control(pDX, IDC_BUTTON3, Cancel);
    DDX_Control(pDX, IDC_BUTTON4, Require);
    }
    BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
    ON_WM_ERASEBKGND()
    ON_WM_CTLCOLOR()
    ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
    ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
    ON_WM_PAINT()
    ON_WM_SIZE()
    END_MESSAGE_MAP()
    // CLoginDlg 消息处理程序BOOL CLoginDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // TODO:  在此添加额外的初始化
    //::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
    HICON ico=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    SetIcon(ico,FALSE);
    HBITMAP h;
    h=(HBITMAP)LoadImage(NULL,theApp.dir+"\\login.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if(h==NULL)
    {
    MessageBox(theApp.dir+"login.bmp"+"load "+" failed");
    //exit(1);
    return FALSE;
    }
    else
    loginBmp.Attach(h); QQnumber.SetColor(RGB(224,225,230));
    QQpassword.SetColor(RGB(224,225,230));
    QQmode.SetColor(RGB(224,225,230));   SetIT.SetColor(RGB(224,225,230));
      Login.SetColor(RGB(224,225,230));
      Cancel.SetColor(RGB(224,225,230));
      Require.SetColor(RGB(224,225,230));
    Require.Invalidate();
    SetIT.Invalidate();
    Login.Invalidate();
       
    return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
    }BOOL CLoginDlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    //CDC *pDC=GetDC();
    CRect rect;
    GetClientRect(&rect);
    CDC dc;
    if(!dc.CreateCompatibleDC(pDC))
    return FALSE;
    BITMAP bmp;
    loginBmp.GetBitmap(&bmp);
    dc.SelectObject(&loginBmp);

    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

    return TRUE;
    //return CDialog::OnEraseBkgnd(pDC);
    }