16,465
社区成员
发帖
与我相关
我的任务
分享
afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)
{
// 将 wParam 强制转换为 CString 类型
CString* strMsg = (CString*)wParam;
int len = strMsg->GetLength();
int i = strMsg->Find('@');
CString str1 = strMsg->Left(i);
CString str2 = strMsg->Right(len-1-i);
SetDlgItemText(IDC_STATIC1,str2);
SetDlgItemText(IDC_STATIC2,str1);
CRect rc,rc2;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rc);
//转换为相对坐标
ScreenToClient(&rc);
//刷新指定区域,注意第2个参数为真,即刷新背景
InvalidateRect(&rc,true);
GetDlgItem(IDC_STATIC2)->GetWindowRect(&rc2);
ScreenToClient(&rc2);
InvalidateRect(&rc2,true);
return 0;
}
HBRUSH CMySubDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//控件背景透明处理开始 -----------------------------------------
if(nCtlColor== CTLCOLOR_STATIC) //如果是静态标签
{
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
//pDC->SetTextColor(RGB(255,0,0));
return (HBRUSH)GetStockObject(NULL_BRUSH);//返回一个空画刷
}
//控件背景透明处理结束 -----------------------------------------
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
BOOL CStaticDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
static CPoint ptLast;
if(pMsg->message == WM_MOUSEMOVE)
{
CPoint newPt;
if(GetAsyncKeyState(VK_LBUTTON))
{
CRect rc;
m_Static.GetWindowRect(&rc);
m_Static.ScreenToClient(&rc);
m_Static.MapWindowPoints(this,&rc);
newPt=pMsg->pt;
ScreenToClient(&newPt);
if(rc.PtInRect(newPt))
{
rc.OffsetRect(newPt.x-ptLast.x,newPt.y-ptLast.y);
ptLast = newPt;
m_Static.MoveWindow(&rc);
m_Static.RedrawWindow();
}
}
else
{
newPt=pMsg->pt;
ScreenToClient(&newPt);
ptLast = newPt;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)
{
CRect rc,rc2;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rc);
//转换为相对坐标
ScreenToClient(&rc);
//刷新指定区域,注意第2个参数为真,即刷新背景
InvalidateRect(&rc,true);
GetDlgItem(IDC_STATIC2)->GetWindowRect(&rc2);
ScreenToClient(&rc2);
InvalidateRect(&rc2,true);
// 将 wParam 强制转换为 CString 类型
CString* strMsg = (CString*)wParam;
int len = strMsg->GetLength();
int i = strMsg->Find('@');
CString str1 = strMsg->Left(i);
CString str2 = strMsg->Right(len-1-i);
SetDlgItemText(IDC_STATIC1,str2);
SetDlgItemText(IDC_STATIC2,str1);
return 0;
}
从以上情况来看,可不可以退出这样的结论:
1、之前的文字残影并不是在父窗口上【因为我重绘窗口后,还是有 重影
2、InvalidateRect(&rc,true);在这里没有起作用?
求救!void CMySubDialog::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//在这里自绘********************************************************************
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);//获取了窗口客户区大小
CDC memDC;//双缓冲内存dc
memDC.CreateCompatibleDC(&dc);
CBitmap bmpBG;//背景图
bmpBG.LoadBitmap(IDB_BITMAP1);//调入资源中的背景图
CBitmap* pOldbmp = (CBitmap*)memDC.SelectObject(&bmpBG);//将背景图缓冲到内存dc
dc.BitBlt(0, 0, rect.right, rect.bottom, &memDC, 0, 0, SRCCOPY);//绘制到窗口屏幕
memDC.SelectObject(pOldbmp);//释放资源
bmpBG.DeleteObject();
//CDialog::OnPaint();
}
}
void CMySubDialog::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//在这里自绘********************************************************************
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);//获取了窗口客户区大小
CDC memDC;//双缓冲内存dc
memDC.CreateCompatibleDC(&dc);
CBitmap bmpBG;//背景图
bmpBG.LoadBitmap(IDB_BITMAP1);//调入资源中的背景图
CBitmap* pOldbmp = (CBitmap*)memDC.SelectObject(&bmpBG);//将背景图缓冲到内存dc
dc.BitBlt(0, 0, rect.right, rect.bottom, &memDC, 0, 0, SRCCOPY);//绘制到窗口屏幕
memDC.SelectObject(pOldbmp);//释放资源
bmpBG.DeleteObject();
//CDialog::OnPaint();
}
}