急!MFC强制重绘问题 ::SendMessage()

ProgJ 2016-12-10 07:57:38
 void CEmailSettingDlg::OnBnClickedOk()
{
UpdateData(1);
CEmailManagementDlg *pdlg = (CEmailManagementDlg*)AfxGetApp()->GetMainWnd();
if (m_str_BackGround == "蒲公英")
m_str_BackGround = "1";
if (m_str_BackGround == "书")
m_str_BackGround = "2";
if (m_str_BackGround == "天空")
m_str_BackGround = "3";
if (m_str_BackGround == "秦时明月")
m_str_BackGround = "4";
//刷新显示新的背景
CString temp = pdlg->m_backGround; //暂存原背景图数据
pdlg->m_backGround = m_str_BackGround;
** ::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0);**
//UpdateWindow();
pdlg->m_backGround = temp;

//如果设置没变,则不需要打开数据库(出于效率考虑)
if (!(m_str_AutoReply == pdlg->m_auto_reply && m_str_BackGround == pdlg->m_backGround))
{
CString temp;
temp.Format("update user_psw_tab set auto_reply = '%s', back_ground = %d where user_name = '%s'", m_str_AutoReply, atoi(m_str_BackGround), pdlg->m_str_UserName);
TRACE(temp);
pdlg->m_db.ExecuteSQL(temp);
AfxMessageBox("更新成功!");
}

CDialogEx::OnOK();
}


void CEmailManagementDlg::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 rc;
GetClientRect(&rc);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;

switch (atoi(m_backGround))
{
case 1:
bmpBackground.LoadBitmap(IDB_BITMAP_FLOWER);
break;
case 2:
bmpBackground.LoadBitmap(IDB_BITMAP_BOOK);
break;
case 3:
bmpBackground.LoadBitmap(IDB_BITMAP_SKY);
break;
case 4:
bmpBackground.LoadBitmap(IDB_BITMAP_QIN);
break;
}

BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

//CDialogEx::OnPaint(); //这句需要去掉
}
}


我想实现实时切换 CEmailManagementDlg的背景
CEmailSettingDlg设置背景数据,点击确定后去刷新CEmailManagementDlg的背景
但是调试发现尽管SendMessage消息以后进入了CEmailManagementDlg的OnPaint函数,但是语句执行完以后并没有改变背景,请问我哪里错了吗。。
...全文
322 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2016-12-12
  • 打赏
  • 举报
回复
InvalidateRect()/UpdateWindow();
xiaohuh421 2016-12-12
  • 打赏
  • 举报
回复
一般都是调用invalidate 并且, 要改变背景, 一般要是重载背景绘制和OnPaint两处.
zgl7903 2016-12-12
  • 打赏
  • 举报
回复
用 UpdateWindow 或 RedrawWindow
ProgJ 2016-12-12
  • 打赏
  • 举报
回复
谢谢各位。说的对的
阿源是少年 2016-12-12
  • 打赏
  • 举报
回复
改用Invalidate() 这是MSDN上的一段话 The WM_PAINT message is generated by the system and should not be sent by an application . To force a window to draw into a specific device context, use the WM_PRINT or WM_PRINTCLIENT message. WM_PAINT除了携带hWnd参数之外,lParam和wParam实际上是携带了其他参数的,你的用法缺少必要信息
schlafenhamster 2016-12-11
  • 打赏
  • 举报
回复
:SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0) ;// 窗口有效 不会 paint 改 Invalidate()

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧