我们都知道任何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过来。