win32sdk编程中,如果我要在窗口中显示文字或者图像,是不是窗口过程函数里一定要有处理WM_PAINT的case语句啊?

neoadane 2006-07-16 07:22:52
win32sdk编程中,如果我要在窗口中显示文字或者图像,是不是窗口过程函数里一定要有处理WM_PAINT的case语句啊?
如果可以没有处理WM_PAINT的case语句,那WM_PAINT消息由谁来处理呢?DefWindowProc吗?
...全文
284 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc_gdi 2006-07-19
  • 打赏
  • 举报
回复
lzg0001(沧海中最不起眼的那一粟) (
说的对
看看windows程序设计
neoadane 2006-07-18
  • 打赏
  • 举报
回复
to:lzg0001(沧海中最不起眼的那一粟)
程序一运行,就一定会有WM_PAINT消息的,这时候窗口过程函数里没有处理WM_PAINT的case语句,那这个WM_PAINT消息由谁来处理?我贴一部分代码在下面
里面不管是WndProc 还是WndProc1,还是CheckBottom都没有处理WM_PAINT消息的case语句。
int CheckBottom (HWND hwnd, int cyClient, int iLine)
{
if (iLine * cyChar + cyChar > cyClient)
{
InvalidateRect (hwnd, NULL, TRUE) ;
UpdateWindow (hwnd) ;
iLine = 0 ;
}
return iLine ;
}

LRESULT APIENTRY WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int iNum, iLine, cyClient ;
HDC hdc ;
TCHAR szBuffer[16] ;

switch (message)
{
case WM_SIZE:
cyClient = HIWORD (lParam) ;
return 0 ;

case WM_TIMER:
if (iNum < 0)
iNum = 0 ;

iLine = CheckBottom (hwnd, cyClient, iLine) ;
hdc = GetDC (hwnd) ;

TextOut (hdc, 0, iLine * cyChar, szBuffer,
wsprintf (szBuffer, TEXT ("%d"), iNum++)) ;

ReleaseDC (hwnd, hdc) ;
iLine++ ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndChild[4] ;
static TCHAR * szChildClass[] = { TEXT ("Child1"), TEXT ("Child2"),
TEXT ("Child3"), TEXT ("Child4") } ;
static WNDPROC ChildProc[] = { WndProc1, WndProc2, WndProc3, WndProc4 } ;
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
WNDCLASS wndclass ;

switch (message)
{
case WM_CREATE:
hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;

for (i = 0 ; i < 4 ; i++)
{
wndclass.lpfnWndProc = ChildProc[i] ;
wndclass.lpszClassName = szChildClass[i] ;

RegisterClass (&wndclass) ;

hwndChild[i] = CreateWindow (szChildClass[i], NULL,
WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
0, 0, 0, 0,
hwnd, (HMENU) i, hInstance, NULL) ;
}

cyChar = HIWORD (GetDialogBaseUnits ()) ;
SetTimer (hwnd, 1, 10, NULL) ;
return 0 ;

case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;

for (i = 0 ; i < 4 ; i++)
MoveWindow (hwndChild[i], (i % 2) * cxClient / 2,
(i > 1) * cyClient / 2,
cxClient / 2, cyClient / 2, TRUE) ;
return 0 ;

case WM_TIMER:
for (i = 0 ; i < 4 ; i++)
SendMessage (hwndChild[i], WM_TIMER, wParam, lParam) ;

return 0 ;

case WM_CHAR:
if (wParam == '\x1B')
DestroyWindow (hwnd) ;

return 0 ;

case WM_DESTROY:
KillTimer (hwnd, 1) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
CW_Wei 2006-07-16
  • 打赏
  • 举报
回复
up
lzg0001 2006-07-16
  • 打赏
  • 举报
回复
可以在其他消息的处理过程中绘制,如鼠标消息,但窗口一被覆盖就什么也没有了!所以最好在WM_PAINT消息中绘制!
你在创建窗口时要指定一个窗口过程函数,窗口的消息都在那是处理,DefWindowProc是windows提供的对所有消息进行默认处理的函数,对于你不想处理的消息都应传给该函数处理,以便维持程序的正常运行!
EddieCai 2006-07-16
  • 打赏
  • 举报
回复
对

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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