【C+SDK】编程时,如何把一副位图文件作为窗口的背景? 【C语言+SDK】工程中,如何把一副位图文件作为窗口的背景?请做过的朋友给一个思路!开发环境:【WinXP/VC++6.0/C/SDK】 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是说【C语言+API】吗? 处理WM_ERASEBKGND或直接在WM_PAINT中画.HDC hdc=GetDC(hWnd); // 如果是在WM_PAINT中, 需要PAINTSTRUCT ps; hdc=BeginPaint(hWnd, &ps);DrawBackGround(hdc, szFileName);ReleaseDC(hWnd, hdc); //如果是在WM_PAINT中, EndPaint(hWnd, &ps);void DrawBackGround(HWND hWnd, HDC hdc, LPCTSTR lpszFileName){RECT rt;GetClientRect(hWnd, &rt);//**如果是 bmp文件, HDC hMemDC=CreateCompatibleDC(hdc);HBITMAP hBitmap=(HBITMAP)LoadImage(...); BIMTAP bm;GetObject(hBitmap, sizeof(bm), &bm);hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);BitBlt(hdc, 0, 0, bm.bmWidth,bm.bmHeight, hMemDC, 0, 0, SRCCOPY);//缩放位图StretchBlt(hdc, 0, 0, rt.right, rt.bottom, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);DeleteObject(hBitmap);DeleteDC(hMemDC);//** 如果是jpg/png/gif等格式, //** 可参考http://blog.csdn.net/chehw/archive/2007/11/01/1860624.aspx中的方法直接绘制}用SDK时有很多细节需要考虑, 1. 首先注册窗口类时wndClassEx.style是否包含了CS_HREDRAW|CS_VREDRAW:如果包含了该风格, 当窗口大小改变时会自动刷新窗口, 但会造成窗口闪烁. 我一般情况下窗口类中不包含上述style, 在处理WM_SIZE时手工重新绘制(注: 不要简单的调用InvalidateRect, 否则效果与包含CS_HREDRAW|CS_VREDRAW时的一样)2. 可以声明一个类成员变量m_hMemDC或全局变量g_hMemDC, 在窗口加载时提前创建内存兼容DC并将图片选入, 这样每次重绘时只要BitBlt就可以了.此时可以考虑在WM_PAINT中重绘背景, RECT &rc=ps.rcPaint; BitBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, m_hMemDC, rc.left, rc.top, SRCCOPH);3. 如果需要缩放位图, WM_SIZE中创建一个相应大小的内存兼容DC, 选入m_hMemDC, 再创建一个临时内存DC, 将文件位图StretchBlt至m_hMemDC中 VC中的WIN32 APP 不行吗,初始化的时候 ::LoadImage(..);在 LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 中处理{// .... case WM_PAINT: hdc = BeginPaint (hWnd, &ps); // 显示位图 EndPaint (hWnd, &ps);//...} LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HBITMAP hbm; HBRUSH hbr; RECT ClientRect; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_ERASEBKGND://添加WM_ERASEBKGND消息的处理 //IDB_BITMAP1为添加的位图资源 hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1)); hdc=(HDC)wParam; hbr=CreatePatternBrush(hbm); GetClientRect(hWnd,&ClientRect); FillRect(hdc,&ClientRect,hbr); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;} IPv6普及了估计也不会有p2p了吧? CButtonST按钮类在vs2005下报错 现在VC发展到哪了? 文档标题显示扩展名问题 一个VC快捷键的问题 windowsXP下调试VC,怎么老是出问题???显示*.dsw都打不开!!! 在线等........ 如何通过ADO对存储过程进行处理 我想做一个组态软件(基于activex控件),可我不知道怎样将数据在运行模式下动态传入一个控件。请各位高手指点 请教高手:调试问题 Tomcat是什么样的软件? ORACLE插入数据的问题 怎样将无符号char 类型转化为 有符号的str
【C语言+API】吗?
DrawBackGround(hdc, szFileName);
ReleaseDC(hWnd, hdc); //如果是在WM_PAINT中, EndPaint(hWnd, &ps);
void DrawBackGround(HWND hWnd, HDC hdc, LPCTSTR lpszFileName)
{
RECT rt;
GetClientRect(hWnd, &rt);
//**如果是 bmp文件,
HDC hMemDC=CreateCompatibleDC(hdc);
HBITMAP hBitmap=(HBITMAP)LoadImage(...);
BIMTAP bm;
GetObject(hBitmap, sizeof(bm), &bm);
hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);
BitBlt(hdc, 0, 0, bm.bmWidth,bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
//缩放位图StretchBlt(hdc, 0, 0, rt.right, rt.bottom, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
//** 如果是jpg/png/gif等格式,
//** 可参考http://blog.csdn.net/chehw/archive/2007/11/01/1860624.aspx中的方法直接绘制
}
用SDK时有很多细节需要考虑,
1. 首先注册窗口类时wndClassEx.style是否包含了CS_HREDRAW|CS_VREDRAW:
如果包含了该风格, 当窗口大小改变时会自动刷新窗口, 但会造成窗口闪烁.
我一般情况下窗口类中不包含上述style, 在处理WM_SIZE时手工重新绘制(注: 不要简单的调用InvalidateRect, 否则效果与包含CS_HREDRAW|CS_VREDRAW时的一样)
2. 可以声明一个类成员变量m_hMemDC或全局变量g_hMemDC, 在窗口加载时提前创建内存兼容DC并将图片选入, 这样每次重绘时只要BitBlt就可以了.
此时可以考虑在WM_PAINT中重绘背景, RECT &rc=ps.rcPaint; BitBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, m_hMemDC, rc.left, rc.top, SRCCOPH);3. 如果需要缩放位图, WM_SIZE中创建一个相应大小的内存兼容DC, 选入m_hMemDC, 再创建一个临时内存DC, 将文件位图StretchBlt至m_hMemDC中
::LoadImage(..);
在 LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 中处理
{
// ....
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// 显示位图
EndPaint (hWnd, &ps);
//...
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HBITMAP hbm;
HBRUSH hbr;
RECT ClientRect;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_ERASEBKGND://添加WM_ERASEBKGND消息的处理
//IDB_BITMAP1为添加的位图资源
hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
hdc=(HDC)wParam;
hbr=CreatePatternBrush(hbm);
GetClientRect(hWnd,&ClientRect);
FillRect(hdc,&ClientRect,hbr);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}