自绘按钮 我在对话框上加了4个自绘按钮,当对话框第一次显示的时候它们都不显示的.当我点击他们就正常了.请问怎么半啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 还有,调用按钮的invalidate不管用啊!! 这是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)); }} 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);} 基于mfc对话框画图的图形显示问题 vc 组合框的一个小问题 哪有 Visual C++实践与提高 COM和COM+ 配套光盘 有偿请教:开发小灵通群发短信,实现时采用软件好还是硬件好?怎么实现?谢谢先! 触发器的问题 一个很难的问题:一个进程如何用其他用户来访问资源? 真诚请教鼠标钩子高手 SDK中怎樣把HWND變數里的數值存到一個char *型的變數中啊? 请教: MouseOver()的算法 NiceFeather: 到主页在线聊天聊聊如何? 谁给网络电子开关编过程的?给点建议。来者有分。 如何获得指定进程的句柄数????
// 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));
}
}
这是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);
}