<请教>SDK编程的一个疑惑。

shincher 2006-02-18 01:20:07
以下是一个简单的API程序:
#include < windows.h >

BOOL RegistWindowsClass( HINSTANCE hInstance );
BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow );
LRESULT WINAPI WndProc( HWND hWnd, UINT Message, UINT wParam, LONG lParam );

int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
if(! RegistWindowsClass( hInstance ))
return FALSE ;

if(! CreateWindows( hInstance, nCmdShow )) //?它所创建的窗口句柄已经丢失
return FALSE ;

MSG Message ;
while( GetMessage( &Message, 0, 0, 0 )) //这个消息循环是属于这个程序的还是这个窗口的?
{
TranslateMessage( &Message );
DispatchMessage( &Message );
}

return Message.wParam ;
}

BOOL RegistWindowsClass( HINSTANCE hInstance )
{
WNDCLASS WndClass ;

WndClass.hInstance = hInstance ;
WndClass.lpszClassName = "WinFill" ;
WndClass.lpfnWndProc = WndProc ;
WndClass.cbClsExtra = 0 ;
WndClass.cbWndExtra = 0 ;
WndClass.style = 0 ;
WndClass.hIcon = LoadIcon( NULL, "END" );
WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
WndClass.lpszMenuName = NULL ;
WndClass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );

return RegisterClass( &WndClass );
}

BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd ;
hWnd = CreateWindow
(
"WinFill",
"填充示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
if(! hWnd )
return FALSE ;

ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );

return TRUE ;
}

LRESULT WINAPI WndProc
(
HWND hWnd,
UINT Message,
UINT wParam,
LONG lParam
)
{

switch( Message )
{
case WM_PAINT:
HDC hDC ;
PAINTSTRUCT PtStr ;
hDC = BeginPaint( hWnd, &PtStr );

SetMapMode( hDC, MM_ANISOTROPIC );

HPEN hPen ;
hPen = (HPEN)GetStockObject( BLACK_PEN );
SelectObject( hDC, hPen );
HBRUSH hBrush ;
hBrush = (HBRUSH)GetStockObject( DKGRAY_BRUSH );
SelectObject( hDC, hBrush );
RoundRect( hDC, 50, 120, 100, 200, 15, 15 );

hBrush = (HBRUSH)GetStockObject( LTGRAY_BRUSH );
SelectObject( hDC, hBrush );
Ellipse( hDC, 150, 50, 200, 150 );

hBrush = (HBRUSH)GetStockObject( HOLLOW_BRUSH );
SelectObject( hDC, hBrush );
Pie( hDC, 250, 50, 300, 100, 250, 50, 300, 50 );

DeleteObject ( hPen );
EndPaint( hWnd, &PtStr );

break ;

case WM_DESTROY:
PostQuitMessage( 0 );
break ;

default:
return( DefWindowProc( hWnd, Message, wParam, lParam ));
}

return 0 ;
}
请注意:
1、在我的函数BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow )结束后,这个函数所创建窗口的句柄并未返回,而是丢失了。只是在返回的WM_CREATE、WM_PAINT这两个消息中带有窗口的句柄值,在这两个消息被处理后程序再也无法获得窗口句柄,然而程序却能正常运行,请问其中原因。
2、程序中的消息循环没有得到窗口的任何参数,那么它是隶属于窗口的还是隶属于程序的,我总是搞不太清楚,请指教。
...全文
128 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shincher 2006-02-19
  • 打赏
  • 举报
回复
第二个问题好像明白了,
从函数BOOL GetMessage( LPMSG, HWND, UINT, UINT ); 的参数 HWND 来看,这个消息循环是属于主程序的。消息循环从应用程序的消息队列中取出消息进行处理,他把具有不同窗口句柄值的消息进行分发,由各个窗口过程处理。至于处理的消息的范围则由 GetMessage 的参数控制。
如果在应用程序的消息队列中有 GetMessage 函数指定的消息范围之外的消息怎么办?(是每个应用程序而不是每个窗口拥有一个单独的消息队列,是这样吧?)

我目前还没找到 MSDN 正在网上下载,太慢了。

第一个问题我还是没懂。
我注册的是窗口类,不是窗口。
另外,窗口过程是隶属于窗口类的,而不是隶属于窗口(实例)的。


还有一个问题,在我写消息处理的case语句时,比如我要在case:break;之间定义一个变量x,
写成 int x = 0 ; 就报错。
而写成 int x ; x = 0 ; 就OK,不知道是为什么?
pomelowu 2006-02-18
  • 打赏
  • 举报
回复
1。“只是在返回的WM_CREATE、WM_PAINT这两个消息中带有窗口的句柄值”

你看你写的WndProc的第一个参数是什么?系统会把CreateWindow得到的句柄传到你注册的窗口的回掉函数中,并不是你认为的“在这两个消息被处理后程序再也无法获得窗口句柄”

2。为什么不看看MSDN呢:
BOOL GetMessage( LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
Parameters

....(略去,我们只看第二个参数)

hWnd
[in] Handle to the window whose messages are to be retrieved. The window must belong to the calling thread. The NULL value has a special meaning:
NULL
GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread using the PostThreadMessage function.

16,551

社区成员

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

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

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