窗口程序-WinAPI之C语言实现

我们都知道任何C#中的类中都包裹着API,所以有时候我们需要更加灵活的处理问题的时候会直接调用系统API

当初一开始学C语言的时候就很想自己写个窗体程序,迫于自己的无知以及别的菜鸟的忽悠…… 这个事情一直没有做成功,害当时的我以为C写个窗体出来是多么难的事情。当然啦,要是直接自己和硬件打交道,那当然是很困难的啊。好就好在微软向外公布的几百个API供我们调用。

C语言版本----Form窗口程序

 

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

int WINAPI WinMain(
   HINSTANCE hInstance,
   HINSTANCE hPreInstance,
   LPSTR lpCmdLine,
   int nCmdShow
)
{
//设计一个窗口类
WNDCLASS wndcls;//窗口结构,注册时需要用到
wndcls.cbClsExtra=0;//结构体后附加的字节数,一般总为0
wndcls.cbWndExtra=0;//窗体实例附加的字节数,一般总为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗体背景色句柄
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//光标句柄
wndcls.hIcon=LoadIcon(NULL,IDC_CROSS);//图标句柄,程序在任务栏中显示的图标
wndcls.hInstance=hInstance;//模块句柄
wndcls.lpfnWndProc=WinSunProc;//函数指针,指向处理窗口消息的函数入口,即窗口处理过程---供windows系统回调用!
wndcls.lpszClassName="sunxin2006";//自定义类名,不要与其他类名重复
wndcls.lpszMenuName=NULL;//菜单名的字符串
wndcls.style=CS_HREDRAW|CS_VREDRAW;//指定窗口风格 常用值:CS_VREDRAW(垂直方向自动重画)、CS_HREDRAW(水平方向自动重画)、CS_DBLCLKS(支持鼠标双击)
RegisterClass(&wndcls);//注册窗体的API


//创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
HWND hwnd;
hwnd=CreateWindow("sunxin2006","zwb",
WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//创建窗体的API,传入位置、模块句柄等


//显示及刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗体的API,传入需要显示的窗体句柄和显示方式
UpdateWindow(hwnd);//刷新窗体的API


//定义消息结构体,开始消息循环
MSG msg;//定义消息结构体变量
while(GetMessage(&msg,NULL,0,0))//从系统的应用程序线程消息队列中取得一个消息
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);//派送消息的API
}
return msg.wParam;
}

//编写窗口过程函数,此函数由系统回调。该函数由上面注册窗体时传入,这样系统就知道往哪里回传消息了

LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
   char szChar[20];
   sprintf(szChar,"char code is %d",wParam);
   MessageBox(hwnd,szChar,"char",0);
   break;
case WM_PAINT:
   HDC hDC;
   PAINTSTRUCT ps;
   hDC=BeginPaint(hwnd,&ps);
   TextOut(hDC,0,0,"zwb",strlen("zwb"));
   EndPaint(hwnd,&ps);
   break;
case WM_CLOSE:
   if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))
   {
        DestroyWindow (hwnd);  
   }
   break;
case WM_DESTROY:
   PostQuitMessage(0);
   break;
default:
   return DefWindowProc(hwnd,uMsg,wParam,lParam);//系统默认处理函数,默认情况下有很多消息是系统自己处理的
}
return 0;
}

上面的代码在DEV-C++ 5 中编译通过,直接Copy过来。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值