求教一下CreateWindow出来的子控件在SW_HIDE之后再SW_SHOW时, 背景图刷新的问题

ayiyi0910 2011-08-03 01:28:17
我写了一个win32的dll, 先CreateWindow一个主窗体, 然后再在上面CreateWindow一个子控件, 也写了一个子控件的消息处理函数, 并且在WM_PAINT的时候给子控件画背景图, 这个时候背景图可以画出来的, 一切正常. 但当我SW_HIDE主窗体后, 再SW_SHOW出主窗体的时候, 那个子控件上的背景图不能画出来了, 请大家指教一下要怎么解决, 这个是win32的,不能用mfc

代码如下:

建立主窗体
m_hWndDLG = CreateWindow(L"DLL", NULL, WS_BORDER,
0, 0, nWidth, nHeight, NULL, NULL, m_hVCInst, (DLGPROC)WindowProc);

主窗体消息处理
LRESULT WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

PAINTSTRUCT ps;
HDC hdc;

switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
return FALSE;
break;
case WM_DESTROY:
PostQuitMessage(0);
return FALSE;
case WM_COMMAND:
{
switch (wmId)
{
case IDC_BUTTON_LINK:
{
OnButtonCall();
}
break;
case IDC_BUTTON_VIDEO:
{
OnButtonVedio();
}
break;
case IDC_BUTTON_BACK:
{
OnButtonBack();
}
break;
case IDC_BUTTON_SPEECH:
{
OnButtonSpeech();
}
break;
case IDC_BUTTON_MINIMIZE:
{
OnButtonMinimize();
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

// return TRUE;
}
break;

case WM_NOTIFY:
{
if(NM_CLICK == ((LPNMHDR)lParam)->code)
{
return OnClickTree(hWnd, ((LPNMHDR)lParam)->hwndFrom);
}
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
};

return DefWindowProc(hWnd, uMsg, wParam, lParam);

// return FALSE; // 返回FALSE给缺省对话框函数DefDlgProc(),表示没有处理本消息
}

// 新建最小化按钮
void NewBtnMinimize(int nID, RECT rect)
{
if (NULL == m_hBmpBtnMinimize)
{
m_hBmpBtnMinimize = GetBitmap(PNG_BTN_MINIMIZE);
}

if (NULL == m_hWBtnMinimize)
{
m_hWBtnMinimize = CreateWindow(_T("Button"), _T(""), WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,
rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, m_hWndDLG, (HMENU)nID, m_hVCInst, NULL);
if (!m_hWBtnMinimize)
{
return;
}
}

g_BtnMinimizeWndProc = (WNDPROC)SetWindowLong(m_hWBtnMinimize, GWL_WNDPROC, (LONG)BtnMinimizeWndProc);

ShowWindow(m_hWBtnMinimize, SW_SHOW);
}

子窗体消息处理
LRESULT CALLBACK BtnMinimizeWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
OnPaint(hWnd, m_hBmpBtnMinimize);
return TRUE;
}
break;
}

return CallWindowProc(g_BtnMinimizeWndProc, hWnd, uMsg, wParam, lParam);
}



void OnPaint(HWND hWnd, HBITMAP hBitMap)
{
RECT rect;
GetClientRect(hWnd, &rect);

int nWidth = rect.right - rect.left;
int nHeight = rect.bottom - rect.top;

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

HDC hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC, hBitMap);

//先将背景画上
BitBlt(hdc, 0, 0, nWidth, nWidth, hMemDC, rect.left, rect.top, SRCCOPY);

EndPaint(hWnd, &ps);
}
...全文
90 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayiyi0910 2011-09-02
  • 打赏
  • 举报
回复
楼上的能不能说详细一点,谢谢了
烂番 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ayiyi0910 的回复:]
求原理, 求真像. m_hBmpBtnMinimize是全局变量, 为什么我锁定和解锁之后它里面的值会被改变
[/Quote]

贴图片不是这么搞的,你直接把hBitmap选到DC里,这个hBitmap就相当于画布了,内容是会被改变的
ayiyi0910 2011-08-24
  • 打赏
  • 举报
回复
求原理, 求真像. m_hBmpBtnMinimize是全局变量, 为什么我锁定和解锁之后它里面的值会被改变
ayiyi0910 2011-08-11
  • 打赏
  • 举报
回复
果然hBitMap有问题, 我是用一个全局变量m_hBmpBtnMinimize来保存图片的, 然后在传给hBitMap

我刚刚试了一下SW_SHOW之后先把那个全局变量m_hBmpBtnMinimize释放, 然后再重新load图片, 就是可以刷出来了

但我想不明白为什么全局变量m_hBmpBtnMinimize会变化
烂番 2011-08-09
  • 打赏
  • 举报
回复
HDC hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC, hBitMap);
======
这个hBitMap很可疑,如果你不用memDC,直接画没问题的话,应该就是这里了
烂番 2011-08-08
  • 打赏
  • 举报
回复
怀疑窗口class的style有问题
实在不行就这样套着用:
ShowWindow(hWnd, sw_show);
InvalidateRect(hWnd, null, true);
beyondma 2011-08-08
  • 打赏
  • 举报
回复
WM_ERASEBACKGROUD你这个消息没有处理。在这里把整个窗体刷一下。
ayiyi0910 2011-08-08
  • 打赏
  • 举报
回复
InvalidateRect(hWnd, null, true);
还是老样子的

还有手机锁定之后, 解锁这几个按钮一样不能刷出背景来, 我看也一下也是调用了OnPaint, 请大家指教一下为什么这两种情况下不能刷出背景来
ayiyi0910 2011-08-07
  • 打赏
  • 举报
回复
顶起来呀
ayiyi0910 2011-08-03
  • 打赏
  • 举报
回复
我现在还没有弄明白,为什么一开始的的时候WM_PAINT是可以的, SW_SHOW后我跟了一下有两个消息, 一个是WM_PAINT, 另一个是WM_ERASEBKGND
lxpspring 2011-08-03
  • 打赏
  • 举报
回复
好像是要在WM_ERASEBACKGROUD消息中做处理吧

7,659

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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