设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 6224|回复: 6

[编程算法] 一个窗口的创建

[复制链接]
发表于 2010-12-24 23:02:33 | 显示全部楼层 |阅读模式
本帖最后由 十二 于 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、这些会变成什么样子呢?
发表于 2010-12-24 23:05:45 | 显示全部楼层
本帖最后由 pa001024 于 2010-12-24 23:07 编辑

大雾……12你太跳了
就跟上英语课一样……编程的乐趣完全被你这货给抹杀了
回复

使用道具 举报

发表于 2010-12-25 10:37:24 | 显示全部楼层
とても難しいですね……
回复

使用道具 举报

 楼主| 发表于 2010-12-25 14:24:57 | 显示全部楼层
本帖最后由 十二 于 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,导致死循环。
回复

使用道具 举报

发表于 2010-12-26 18:16:55 | 显示全部楼层
有关窗口函数的部分都没认真学过,跟同学一起偷懒直接用VS2010里面的工具生成函数然后改参数加语句什么的
我说12君有汇编作基础学这些语言都是浮云吧,这么快就把我们两年学的东西学完了呢
回复

使用道具 举报

 楼主| 发表于 2010-12-27 18:29:56 | 显示全部楼层
函数还好说  结构和类型好烦
回复

使用道具 举报

 楼主| 发表于 2010-12-27 18:32:41 | 显示全部楼层
函数还好说  结构和类型好烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-11-1 04:10

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表