c++同时绘制30张图片在一个窗口内,怎么用代码实现
答案:2 悬赏:0
解决时间 2021-03-08 17:52
- 提问者网友:妖精ξ也會哭
- 2021-03-07 18:49
c++同时绘制30张图片在一个窗口内,怎么用代码实现
最佳答案
- 二级知识专家网友:不服输就别哭
- 2021-03-07 19:41
TCHAR* szbmp[][2]={ // 扩充为 [5][6], 下面i,j范围同样扩充......
{".\\Bitmap\\1.bmp",".\\Bitmap\\2.bmp"},
{".\\Bitmap\\3.bmp",".\\Bitmap\\4.bmp"},
};
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){
static HDC hdc_bm[2][2]; static int g_w[2][2], g_h[2][2];
static int dw,dh;
switch(msg){
case WM_CREATE:{ HDC hdc=GetDC(hWnd);
HBITMAP hbm;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++){
hdc_bm[i][j]=CreateCompatibleDC(hdc);
hbm=(HBITMAP)LoadImage(0,szbmp[i][j],IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(!hbm) eInfo(szbmp[i][j]);
SelectObject(hdc_bm[i][j],hbm);
BITMAP bm; GetObject(hbm,sizeof(bm),&bm); g_w[i][j]=bm.bmWidth; g_h[i][j]=bm.bmHeight;
DeleteObject(hbm);
}
RECT rc; GetClientRect(hWnd,&rc); dw=rc.right/2, dh=rc.bottom/2;
}break;
case WM_DESTROY: PostQuitMessage(0); break;
case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hWnd,&ps);
for(int i=0; i<2;i++)
for(int j=0;j<2;j++){
StretchBlt(hdc,dw*i,dh*j,dw,dh, hdc_bm[i][j],0,0,g_w[i][j],g_h[i][j], SRCCOPY);
}
EndPaint(hWnd,&ps);
} break; // from case WM_PAINT
case WM_COMMAND:{
switch(LOWORd(wParam)){
case IDT_TEST: break;
} // switch(LOWORd(wParam))
}break; // WM_COMMAND
default: break;
}
return DefWindowProc( hWnd, msg, wParam, lParam ); // 不带W则窗口标题显示不正常.因为CreateWindow带了W.
}
{".\\Bitmap\\1.bmp",".\\Bitmap\\2.bmp"},
{".\\Bitmap\\3.bmp",".\\Bitmap\\4.bmp"},
};
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){
static HDC hdc_bm[2][2]; static int g_w[2][2], g_h[2][2];
static int dw,dh;
switch(msg){
case WM_CREATE:{ HDC hdc=GetDC(hWnd);
HBITMAP hbm;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++){
hdc_bm[i][j]=CreateCompatibleDC(hdc);
hbm=(HBITMAP)LoadImage(0,szbmp[i][j],IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(!hbm) eInfo(szbmp[i][j]);
SelectObject(hdc_bm[i][j],hbm);
BITMAP bm; GetObject(hbm,sizeof(bm),&bm); g_w[i][j]=bm.bmWidth; g_h[i][j]=bm.bmHeight;
DeleteObject(hbm);
}
RECT rc; GetClientRect(hWnd,&rc); dw=rc.right/2, dh=rc.bottom/2;
}break;
case WM_DESTROY: PostQuitMessage(0); break;
case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hWnd,&ps);
for(int i=0; i<2;i++)
for(int j=0;j<2;j++){
StretchBlt(hdc,dw*i,dh*j,dw,dh, hdc_bm[i][j],0,0,g_w[i][j],g_h[i][j], SRCCOPY);
}
EndPaint(hWnd,&ps);
} break; // from case WM_PAINT
case WM_COMMAND:{
switch(LOWORd(wParam)){
case IDT_TEST: break;
} // switch(LOWORd(wParam))
}break; // WM_COMMAND
default: break;
}
return DefWindowProc( hWnd, msg, wParam, lParam ); // 不带W则窗口标题显示不正常.因为CreateWindow带了W.
}
全部回答
- 1楼网友:悲观垃圾
- 2021-03-07 21:04
mfc的绘图类其实是对windows gdi api的封装,目前发展到gdi+,其实直接使用gdi+也是相当强大的,我给你介绍一下怎么使用windows的gdi+吧:
(1)准备使用gdi+ 的api
#include <windows.h>
#include <gdiplus.h>
using namespace gdiplus;
void example_drawrectangle(hdc hdc)
{ // 参数hdc为绘图设备上下文句柄,你可以用getdc()之类的函数获取
graphics graphics(hdc); // 构造一个graphics对象,然后绘图就引用此对象方法即可绘图,真是厉害
pen blackpen(color(255, 0, 0, 0), 3);
rect rect(0, 0, 200, 200); // 矩形
graphics.drawrectangle(&blackpen, rect); // 绘制一个矩形
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |