首页 > 代码库 > C语言调用WIN32 API教程之1创建窗口

C语言调用WIN32 API教程之1创建窗口

本学习笔记基于VC++6.0开发环境,通过c语言编程语言,调用win32 API进行windows系统应用程序开发。

1,打开VC++6.0,点击 文件->新建->工程->Win32 Application 工程名填写example1,点击确定,选择 一个空工程,点击完成。

2,点击"新建文件" 按钮,新建一个空白文件,点击 文件->另存为 输入文件名example1.c 选择工作空间对应的文件夹,保存。

3,点击FileView,右击Source File,点击 添加文件到目录,选择example1.c,点击确定。

4,添加代码

#include <windows.h>
#include <Shlwapi.h>


LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);  //声明消息回调函数

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PTSTR szCmdLine,int iCmdShow)  //Win32 Api 主程序函数入口
{
WNDCLASS wndcls;                                                                 //定义窗体类
HWND hwnd;                                                                          //定义句柄用来保存成功创建窗口后返回的句柄
MSG msg;                                                                                     //定义消息结构体变量
wndcls.cbClsExtra=0;                                                                     //结构体后附加的字节数,一般总为0
wndcls.cbWndExtra=0;                                                                  //窗体实例附加的字节数,一般总为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);   //背景颜色
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);                            //光标句柄
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);                            //图标句柄 任务栏显示的图标
wndcls.hInstance=hInstance;                                                        //模块句柄
wndcls.lpfnWndProc=WinSunProc;                                             //函数指针,指向处理窗口消息的函数入口
wndcls.lpszClassName="windows";                                             //自定义类名,不要与其他类名重复
wndcls.lpszMenuName=NULL;                                                    //菜单名的字符串
wndcls.style=CS_HREDRAW | CS_VREDRAW;                            //指定窗口风格 详见参数注释1
if (!RegisterClass (&wndcls))return 0;                                        //注册窗体类,如果失败直接返回0结束程序
hwnd=CreateWindow("windows","创建一个新窗口",WS_OVERLAPPEDWINDOW,0,0,300,150,NULL,NULL,hInstance,NULL);//创建窗体

//APIWS_OVERLAPPEDWINDOW为 Window Styles  //详见参数注释2
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗体的API 传入需要显示的窗体句柄和显示方式
UpdateWindow(hwnd);//刷新窗体的API

while(GetMessage(&msg,NULL,0,0))//进入消息循环
{
TranslateMessage(&msg);//将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出
DispatchMessage(&msg); //该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数
}
return 0;
}
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)//回调函数定义
{
switch(uMsg)
{
case WM_DESTROY://关闭窗口是系统发送的消息
PostQuitMessage(0);//发送退出消息GetMessage收到消息后将return 0,主函数退出消息循环
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);//不处理的消息交给系统处理。
}
return 0;
}

5,参数详细分析

参数注释1

窗口类风格参数

      1,CS_VREDRAW: 当垂直长度改变或移动窗口时,重画整个窗口

      2,CS_HREDRAW: 当水平长度改变或移动窗口时,重画整个窗口

  3,CS_DBLCLKS: 允许向窗口发送双击鼠标键的消息

   当双击窗体时

   如果窗口没有CS_DBLCLKS标志,则系统向窗口依次发送如下消息:

   1 WM_LBUTTONDOWN  2 WM_LBUTTONUP   3 WM_LBUTTONDOWN   4 WM_LBUTTONUP

   如果窗口有CS_DBLCLKS标志,则系统向窗口依次发送如下消息:

   1 WM_LBUTTONDOWN  2 WM_LBUTTONUP   3 WM_LBUTTONDBLCLK  4 WM_LBUTTONUP

  4,CS_GLOBALCLASS: 当调用CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的hInstance参数和注册窗口类时传递给

  RegisterClass 的 hInstance参数不同。如果不指定该风格,则这两个 hInstance 必须相同。

      5,CS_BYTEALIGNCLIENT: 在字节边界上(在x方向上)定位窗口的用户区域的位置

  6,CS_BYTEALIGNWINDOW: 在字节边界上(在x方向上)定位窗口的位置

  7,CS_CLASSDC: 该窗口类的所有窗口实例都共享一个窗口类DC

  8,CS_OWNDC: 给予每个窗口实例它本身的DC。注意,尽管这样是很方便,但它必须慎重使用,因为每个DC大约要占800个字节的内存。

  9,CS_PARENTDC: 将子窗口的裁剪区域设置到父窗口的DC中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从系统缓存中获取DC,而不是使用父窗口的DC。使用该风格可以提高系统性能。

  10,CS_NOCLOSE: 禁止系统菜单的关闭选项

  11,CS_SAVEBITS: 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息。该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失。设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存。

参数注释2

1,WS_OVERLAPPED

重叠窗口(overlapped window),具有应用程序主窗口的全部特点。它的非客户区包括一个可伸缩的框架、菜单条、标题栏和最小化、最大化按钮。

2,WS_POPUP
弹出窗口(popup window),具有消息框或者对话框的全部特点。它的非客户区包括一个固定大小的框架和一个标题栏。

3,WS_CHILD

子窗口(child window),具有类似按钮控件的全部特点。它没有非客户区,窗口的处理过程负责绘制窗口的每个部分。

4,WS_MINIMIZE

表示窗口是最小化的

5,WS_MAXIMIZE

表示窗口是最大化的

6,WS_VISIBLE

控制窗体是否显示
7,WS_DISABLED

控制窗体是否可用
8,WS_CLIPSIBLINGS

这个属性的含义需要特别注意,它的意思就是剪辑兄弟窗口,也就是不对兄弟窗口进行绘制,为什么会绘制兄弟窗口?因为两个窗口可能会重叠!!!如果父亲窗口是overlapped的重叠窗口,那么兄弟窗口必然会涉及到覆盖剪辑问题。如果某子窗口使用了ws_clipsiblings属性,那么被该窗口覆盖的兄弟窗口区域本窗口就不在进行绘制了,就是说本窗口不绘制在其下面还有兄弟窗口的那部分窗口,效果就是在其下面的兄弟窗口即使z次序小于本窗口【在本窗口的下面的兄弟窗口】,如果本窗口设置了clipsublings那么下面兄弟窗口就可以显示出来了(没有绘制该部分使得下面的遮挡部分兄弟显示出来了)
9,WS_CLIPCHILDREN

其含义就是,父窗口不对子窗口区域进行绘制。默认情况下父窗口会对子窗口背景是进行绘制的,但是如果父窗口设置了WS_CLIPCHILDREN属性,父亲窗口不在对子窗口背景绘制。

10,WS_CAPTION 

创建该窗口具有标题栏 (意味着WS_BORDER样式)。 不能与使用WS_DLGFRAME样式
11,WS_BORDER

创建具有边框的窗口
12,WS_DLGFRAME

创建一个带对话框边框风格的窗口(双边框)。这种风格的窗口不能带标题条
13,WS_VSCROLL

出现垂直滚动条

14,WS_HSCROLL

出现水平滚动条
15,WS_SYSMENU

控制窗口右上角的按键(最大化,最小化,关闭)
16,WS_THICKFRAME

可以调节窗口大小,鼠标在窗口边沿时变成双向箭头
17,WS_GROUP

指定一组控件在其中用户可以从一个控件移到下的箭头键的第一个控件。 使用定义的所有控件WS_GROUP样式FALSE的第一个控件属于同一个组之后。 使用下一个控件WS_GROUP样式启动下一个组 (即,开始下的一个组结尾)
18,WS_TABSTOP

控件通过其用户可以通过使用 TAB 键移动的任意数量之一指定。 TAB 键将用户移至指定的下一个控件WS_TABSTOP样式

19,WS_MINIMIZEBOX

控制是否显示窗口右上角的“最小化”按钮
20,WS_MAXIMIZEBOX

控制是否显示窗口右上角的“最大化”按钮

常用的组合定义

WS_TILED与WS_OVERLAPPED相同

WS_ICONIC与 WS_MINIMIZE相同

WS_SIZEBOX与 WS_THICKFRAME相同

WS_TILEDWINDOW与 WS_OVERLAPPEDWINDOW相同

WS_OVERLAPPEDWINDOW相当于 (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)

WS_POPUPWINDOW相当于 (WS_POPUP | WS_BORDER | WS_SYSMENU)

WS_CHILDWINDOW相当于 (WS_CHILD)

 

 

 

C语言调用WIN32 API教程之1创建窗口