有段代码不理解 case wm_size

piaomiao163 2009-01-25 08:24:27
case WM_SIZE :

if ( message == WM_SIZE )
{
statement
}



都已经传来的是 WM_SIZE 消息了~为什么后面还 if判断一下~~??
...全文
215 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pgymail 2009-11-28
  • 打赏
  • 举报
回复
顶2楼,2楼精辟·~
Guilty 2009-01-25
  • 打赏
  • 举报
回复
2楼的不错,没看代码就想到。
xiaoyisnail 2009-01-25
  • 打赏
  • 举报
回复
如果消息是WM_CREAT,那也会进入WM_SIZE,正因为如此所以要在WM_SIZE里再用if判断一下,不是很好理解吗?楼主在仔细想想
lightnut 2009-01-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 piaomiao163 的回复:]
'''
但是如果传来的是 WM_SIZE 消息~~那么不就是直接进入 case WM_SIZE:了吗??如果传来的是WM_CREATE 那么WM_CREATE完毕后由于没有break 那么将继续 但是 message 这时候是 WM_CREATE啊 ··也不是WM_SIZE 啊~~它这里if了一下是什么意思····还望指点一下~~

[/Quote]
在你这段代码里, case WM_CREAT和case WM_SIZE有相同的代码需要执行, 而这段相同的代码位于case WM_SIZE块中,
所以上面的case WM_CREAT不用break. 但是针对WM_SIZE又有不同的代码要执行 , 所以用if(....)来限定只针对WM_SIZE
消息要执行的代码.
waizqfor 2009-01-25
  • 打赏
  • 举报
回复

case WM_SIZE:
// obtain window size in pixels

if (message == WM_SIZE)
{
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
}
// calculate window size in characters

cxBuffer = max (1, cxClient / cxChar) ;
cyBuffer = max (1, cyClient / cyChar) ;

// allocate memory for buffer and clear it

if (pBuffer != NULL)
free (pBuffer) ;

pBuffer = (TCHAR *) malloc (cxBuffer * cyBuffer * sizeof (TCHAR)) ;

for (y = 0 ; y < cyBuffer ; y++)
for (x = 0 ; x < cxBuffer ; x++)
BUFFER(x,y) = ' ' ;

// set caret to upper left corner

xCaret = 0 ;
yCaret = 0 ;

你的switch语句不够完成 不知道下面是什么了
可以判断的是 你前面的case都没有break 跳出 也就是前面的case条件成立 会一直执行下去
所以也会执行到你的 case WM_SIZE:
这里的if (message == WM_SIZE) 判断的是 是不是第一switch就运行到 case WM_SIZE: 如果是就运行if里面语句 如果不是 跳过if语句 执行下面的语句
message == WM_SIZE记住这里的message 不是随时改变的
piaomiao163 2009-01-25
  • 打赏
  • 举报
回复
对对~~确实没有break 或者return
但是如果传来的是 WM_SIZE 消息~~那么不就是直接进入 case WM_SIZE:了吗??如果传来的是WM_CREATE 那么WM_CREATE完毕后由于没有break 那么将继续 但是 message 这时候是 WM_CREATE啊 ··也不是WM_SIZE 啊~~它这里if了一下是什么意思····还望指点一下~~



switch (message)
{
case WM_INPUTLANGCHANGE:
dwCharSet = wParam ;
// fall through
case WM_CREATE:
hdc = GetDC (hwnd) ;
SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,
dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)) ;

GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight ;

DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;
ReleaseDC (hwnd, hdc) ;
// fall through
case WM_SIZE:
// obtain window size in pixels

if (message == WM_SIZE)
{
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
}
// calculate window size in characters

cxBuffer = max (1, cxClient / cxChar) ;
cyBuffer = max (1, cyClient / cyChar) ;

// allocate memory for buffer and clear it

if (pBuffer != NULL)
free (pBuffer) ;

pBuffer = (TCHAR *) malloc (cxBuffer * cyBuffer * sizeof (TCHAR)) ;

for (y = 0 ; y < cyBuffer ; y++)
for (x = 0 ; x < cxBuffer ; x++)
BUFFER(x,y) = ' ' ;

// set caret to upper left corner

xCaret = 0 ;
yCaret = 0 ;
lightnut 2009-01-25
  • 打赏
  • 举报
回复
是不是上一句case没有用break结束呀?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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