| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1142 人关注过本帖
标题:请教一个gdi 的问题
只看楼主 加入收藏
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 
真的吗在CASE WM_LBUTTONDOWN:下先用ONPAINT()就行了?
2006-04-27 12:27
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 

干脆弄清楚一点,这是我的代码
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT lprc;
HFONT hFont;
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
{
int x=40,y=40;
hdc = BeginPaint(hWnd, &ps);
HPEN hPen=CreatePen(PS_SOLID,3,RGB(0,0,0)),
hPenOld=CreatePen(PS_SOLID,1,RGB(0,0,0));
for (int i=0;i<10;++i)
{
if (i==3||i==6)
{
SelectObject(hdc,hPen);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x+450, y);
y+=50;x=40;
}
else
{
SelectObject(hdc,hPenOld);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x+450, y);
y+=50;x=40;
}
}

x=40;y=40;
for (int i=0;i<10;++i)
{
if (i==3||i==6)
{
SelectObject(hdc,hPen);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x, y+450);
x+=50;y=40;
}
else
{
SelectObject(hdc, hPenOld);
MoveToEx(hdc, x, y, NULL);
LineTo(hdc, x, y+450);
x+=50;y=40;
}
}
DeleteObject(hPen);
DeleteObject(hPenOld);
EndPaint(hWnd, &ps);
}
break;
case WM_LBUTTONDOWN :
{
if(LOWORD(lParam)>40&&LOWORD(lParam)<490
&&HIWORD(lParam)>40&&HIWORD(lParam)<490)
{
int n1=(LOWORD(lParam)-42)/50;
int n2=(HIWORD(lParam)-42)/50;
hFont= CreateFont(40,20,0,0,0,0,0,0,0,0,0,0,0,0);
hdc=GetDC(hWnd);
SelectObject(hdc,hFont);
SetRect(&lprc,42+50*n1, 42+50*n2, 88+50*n1, 88+50*n2);
DrawText(hdc,"4",-1,&lprc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
DeleteObject(hFont);
}
}

break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}

2006-04-27 12:49
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 
主要是case WM_LBUTTONDOWN:下要把字画出来,但窗口重绘又不消失。
2006-04-27 12:51
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 
若将消息转到WM_PAINT,WM_PAINT原有的代码又执行一次好像罗嗦了些
2006-04-27 12:54
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
你的代码当然有问题,当窗口需要重绘的时候WndProc会收到WM_PAINT消息,而你对于该消息的处理过程中没有调用DrawText,那么重绘过后你的文字自然消失了,你可以这样,定义一个逻辑变量,当处理了 WM_LBUTTONDOWN 消息后将该变量设为真,然后在处理WM_PAINT消息时判断该变量为真的话就画出文字,代码和处理WM_LBUTTONDOWN 消息的一致

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-04-27 13:47
yongyong
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-4-26
收藏
得分:0 
楼上说的办法是可行的,但是有更简洁更一般的办法:
创建一个内存DC(如果不明白自己去查相关资料),所有绘图操作都画在此内存DC上。
在WM_PAINT消息的响应代码中,将这个内存DC复制(用blt函数)到当前窗口DC。

这样就能保证你画的东西不会丢失,而且,这样做还可以防止闪烁,
这是相对比较专业的一种做法,模仿了DirectDraw的双缓冲动画机制。
2006-04-27 15:29
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 
可我要在程序运行的时候画出文字,而并非一次完成.
2006-04-28 09:18
jedimaster
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2006-3-31
收藏
得分:0 
用你说的办法也行吗
2006-04-28 09:18
yongyong
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-4-26
收藏
得分:0 
当然可以,没有问题的,我忘了说,要加一步:每次画完内存DC之后,马上把内存DC复制到窗口DC上。否则就不能立即同步显示了。
2006-04-28 12:53
lisypro
Rank: 4
等 级:业余侠客
威 望:3
帖 子:695
专家分:216
注 册:2005-9-25
收藏
得分:0 

agree


长期承接管理系统
代做各种vb/ / vc小程序
QQ:82341763
手机:13623290828
群号 11619730
2006-04-28 14:00
快速回复:请教一个gdi 的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015673 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved