一个窗口的创建
本帖最后由 十二 于 2010-12-25 01:36 编辑以下是一个标准C创建窗口的代码,当然我看不太懂(众人:那你贴个屁),- =。。。。。。。
代码来自RadASM。
#include "windows.h" 包含的文件头,学过C的应该都知道我就不废话了。这里定义了函数所需要的参数,好处是可以方便的看到参数的hex值。
#pragma comment(linker, "/ENTRY:EntryPoint") 这个其实我也不知道干什么的(众人:鄙视你),我真的不知道PA飞,百度的解释改变入口。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);定义一个窗口消息回调函数。HWND为消息的窗口句柄、UINT为消息ID、WPARAM, LPARAM为消息的具体内容。
void EntryPoint()
{
ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL));以上全是废话,实在想不开可以全部删除掉把LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);放在WinMain后面,当然保留#include "windows.h"
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)入口函数
函数原型:
int WINAPI WinMain
(
HINSTANCE hInstance,应用程序当前实例的句柄,进程句柄。
HINSTANCE hPrevInstance,应用程序的先前实例的句柄,(一个程序可以被多次OpenProcess打开,函数将会返回进程句柄。句柄并不唯一,旧句柄依旧有效,新句柄不会替代旧句柄。且每个句柄的权限会被保留。)
LPSTR lpCmdLine指向应用程序命令行的字符串的指针。
int nCmdShow指明窗口如何显示,你可以说这个功能是多此一举因为ShowWindow函数可以直接设置窗口的状态还要这个干嘛。但这样可以在创建窗口之前指定nCmdShow的值。来控制窗口状态
);
{
static TCHAR szAppName[]=TEXT("Windows");定义一个全局静态变量,szAppName数组里记录了类名。
HWND hwnd; 句柄
MSG msg;定义一个消息变量,MSG是消息结构。
WNDCLASS 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.lpszMenuName=NULL;窗口无菜单
wndclass.lpszClassName=szAppName;窗口类名为“szAppName”
if(!RegisterClass(&wndclass)) 注册窗口
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
CreateWindow函数创建窗口实例。
hwnd=CreateWindow(szAppName, //window class name指定要创建窗口的类名。创建后窗口句柄送hwnd
TEXT("Windows 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
http://baike.baidu.com/view/1001690.html CreateWindow原型
ShowWindow(hwnd,iCmdShow);显示窗口 http://baike.baidu.com/view/1013883.htm 原型
UpdateWindow(hwnd); 重绘窗口 http://baike.baidu.com/view/1013910.htm 原型
while (GetMessage(&msg,NULL,0,0)) 得到消息并存放到 MSG结构中去 http://baike.baidu.com/view/1013920.html?wtp=tt 原型
{
TranslateMessage(&msg); 翻译消息 http://baike.baidu.com/view/1013950.htm 原型
DispatchMessage(&msg); 派发消息 http://baike.baidu.com/view/1013961.htm 原型
}
// MessageBox(NULL,TEXT("2"),TEXT("CAPTION"),MB_OK);
return msg.wParam; 返回wParam中的消息
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 消息处理函数
{
switch(message) 循环获得消息
{
case WM_CREATE: 获取到一个应用程序创建窗口消息。
//Put your code here 正如这里所写可以写你想实现的功能。
return 0;
case WM_PAINT:UpdateWindow重绘窗口时会收到此消息
//Put your code here 如上
return 0;
case WM_DESTROY:当关闭窗口时会收到此消息
PostQuitMessage(0);终止程序
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam); 剩余消息全部交给系统处理
}
一个比较基础的窗口创建流程。看到这或许你会觉得不屑这些,用MFC、或者其他类库可以轻易的创建一个窗口。如果没有CreateWindow、ShowWindow、这些会变成什么样子呢? 本帖最后由 pa001024 于 2010-12-24 23:07 编辑
大雾……12你太跳了
就跟上英语课一样……编程的乐趣完全被你这货给抹杀了 とても難しいですね…… 本帖最后由 十二 于 2010-12-25 14:32 编辑
窗口的绘制
UpdateWindow会触发WM_PAINT消息,return 0;后交由DefWindowProc处理该消息,DefWindowProc会调用BeginPaint和EndPaint。来重新绘制窗口。
BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个
PAINTSTRUCT结构中。http://baike.baidu.com/view/1014019.htm函数原型和例子。
很容易看出在窗口进行重绘时BeginPaint担当者绘制实例的角色。这样便可以用任意一个消息,重新绘制任意的UI窗口,函数的返回值是一个“显示设备描述表”句柄。这样可以用GDI32.DLL中导出任意函数来DIY窗口了。
补充WM_PAINT处理函数中必须有BeginPaint。如果没有Update Region则不为空系统会一直发送WM_PAINT,导致死循环。 有关窗口函数的部分都没认真学过,跟同学一起偷懒直接用VS2010里面的工具生成函数然后改参数加语句什么的
我说12君有汇编作基础学这些语言都是浮云吧,这么快就把我们两年学的东西学完了呢 函数还好说结构和类型好烦 函数还好说结构和类型好烦
页:
[1]