刚学vc一些基础概念不明白 窗口类不是一个类吗,为什么创建这个类时还要初始化里面的成员?这样窗口类不就成了实例了吗?注册这个窗口类不是注册一个类型吗?那么如果初始化了,还叫类型吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 窗口类是一个类,可是在我们的程序中它要被实例化先,使其成为对象,那么我们不初始化这个对象行吗???注册窗口就是把我们程序的窗口的有关信息告诉windows,如果我们不告诉,人家怎么处置??不要让书把自己搞迷糊了,我们创建程序窗口就是利用窗口类创建的对象,然后要把我们的窗口告诉人家,OK,记住这些就可以了 按照csdnzhu(我什么也不会)老兄的说法,注册是针对对象的对吗?那创建又有什么有?每创建一个窗口就的注册一次吗? to: huanyun(无妻徒刑)虽然我是菜鸟,但你说的这些我早就知道了。请大家看源码吧。#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLAS wndclass ; //wndclass是个对象? wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuNam = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) //注册的是对象? { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow( szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_CREATE: PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;} 我认为是这样的,因为窗口与窗口的实现是不一样。在Windows程序中,由系统来控制程序的运行,而不是像DOS下那样,由程序来取得控制权,也就是你看到的那样,在DOS下如果你的程序陷入死循环会死机,而Windows下的程序我们有办法将它终止。那么,你在创建窗口后就应该将自己程序的一些特点告诉Windows,例好消息的函数,你必须告诉windows,然后程序运行起来后,Windows才会将有关消息投递到你的程序里。 上面的朋友说的都不错。只是笼统了一点。对于你刚学习windows 编程,有点难理解是正常的。wndclass 显然是一个结构类型。无可非议。你不要被它的名字迷惑。为什么要用wndclass 那是微软工程师的设计。(看的出来目的是为了清晰明了)主要是给registerclass的输入的参数。从你的问题里 我看出你最迷惑的可能是registerclass是干什么的,建立窗口和我们学C++的类建立对象不太一样。(毕竟学C++看的书都是入门的,也和windows编程联系很少)。在windows里面建立窗口我们需要告诉操作系统关于你的新的应用程序的信息。因为Win32是一个多任务的操作系统,所有运行的应用程序必须把自己的的信息存放在操作系统的内部数据库中。需要填充一个WNDCLASS结构,通过使用RegisterClass这个系统API(应用程序接口),来将这些信息告诉操作系统。如果操作系统接受你的信息,这个函数返回一个非零值。WNDCLASS结构中有三个参数比较重要,hInstance、lpszClassName和lpfnWndProc. “hInstance”是一个用来识别你应用程序的唯一的数字(或是进程ID).你将会从操作系统中得到这个值。我们将在程序的几个地方用到它。“lpszClassName”是当我们创建窗口时用来识别应用程序自己的唯一的字符串。最后的一个是“lpfnWndProc”。它是一个用来获得系统通知消息的函数名称。这些都是直接和系统打交道的,并不像你自己建立的类和对象那么单纯。所以用了API函数。我至今也不知道registerclass.他到底是怎么做的 只知道的做什么。因为微软没有公开源码,(有知道的朋友回个贴)。createwindow才是创建对象。 明白了,多谢大家尤其是fvv(守护者)和csdnzhu(我什么也不会) 。早上心情不太好,希望大家别介意。 我创建了一个MFC的工程编写了程序 请教CDC::TextOut无法显示 socket关闭两个方向连接的问题 一道关于字符串的问题 我使对话框程序在启动时自动隐藏了(代码见下面),现在要通过一个快捷键让它再显示,应该怎么让它显示? 300分再急问:如何将一系列2560*1920的JPG图像转换为100*75的BMP图像,然后保存到一个文件中???? 动态建立控件的问题 我想知道VC6把标准库的代码放在哪了?比如iostream 如何改变对话框的底色? CreateProcess函数调用产生异常 高分请教来都有分 socket阻塞和非阻塞,用哪种方式好?
虽然我是菜鸟,但你说的这些我早就知道了。请大家看源码吧。#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLAS wndclass ; //wndclass是个对象? wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuNam = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) //注册的是对象?
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ; case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
wndclass 显然是一个结构类型。无可非议。你不要被它的名字迷惑。
为什么要用wndclass 那是微软工程师的设计。(看的出来目的是为了清晰明了)主要是给
registerclass的输入的参数。从你的问题里 我看出你最迷惑的可能是registerclass是干什么的,建立窗口和我们学C++的类建立对象不太一样。(毕竟学C++看的书都是入门的,也和windows编程联系很少)。在windows里面建立窗口我们需要告诉操作系统关于你的新的应用程序的信息。因为Win32是一个多任务的操作系统,所有运行的应用程序必须把自己的的信息存放在操作系统的内部数据库中。需要填充一个WNDCLASS结构,通过使用RegisterClass这个系统API(应用程序接口),来将这些信息告诉操作系统。如果操作系统接受你的信息,这个函数返回一个非零值。
WNDCLASS结构中有三个参数比较重要,hInstance、lpszClassName和lpfnWndProc. “hInstance”是一个用来识别你应用程序的唯一的数字(或是进程ID).你将会从操作系统中得到这个值。我们将在程序的几个地方用到它。“lpszClassName”是当我们创建窗口时用来识别应用程序自己的唯一的字符串。最后的一个是“lpfnWndProc”。它是一个用来获得系统通知消息的函数名称。这些都是直接和系统打交道的,并不像你自己建立的类和对象那么单纯。所以用了API函数。我至今也不知道registerclass.他到底是怎么做的 只知道的做什么。因为微软没有公开源码,(有知道的朋友回个贴)。createwindow才是创建对象。