win32编程 自己写窗口

一、1.控制台程序 //不需要完善的windows窗口,使用dos窗口方式显示
    2.win32窗口程序 //通过窗口与程序之间进行交互
    3.win32库程序(动态库DLL、静态库LIB) //提供已有的代码供其他程序使用
    动态库:在执行的时候可以加载的程序
    静态库:在编译连接时使用的程序

对比:(1)程序入口函数不同
  控制台:       main
  win32窗口程序:WinMain
  win32动态库DLL:DllMain
  win32静态库Lib:无入口函数
      (2)编译连接后存在形式不同
  控制台和win32窗口程序:exe文件
  动态库DLL:DLL文件,无法执行
  静态库LIB:LIB文件,无法执行
       (3)执行结果不同
  控制台:使用DOS窗口显示结果,自己无窗口
  Win32窗口程序:产生自己的窗口将结果输出或结束输入
  动态库DLL:提供可执行的代码但自己无法执行,当exe文件执行时,可以使用此代码
  静态库LIB:提供给程序在编译连接时使用,将库中代码嵌入到程序中。执行时不需要该库存在

二、Win32 程序和编译环境
1.编译器:CL.EXE      //将源代码编译成目标代码.obj文件
2.连接器:Link.EXE    //在VC98/bin下  //连接.obj和库函数,生成exe
3.资源编译器:rc.exe  //在Common/MSDev98/bin目录下 //将资源脚本编译成可以连接的.res文件
4.库和头文件
头文件windows.h中包含了windows程勇的定义及其他一些头文件
 windef.h   定义了各种数据类型
 winbase.h  定义了kernel的相关函数
 wingdi.h   定义了绘图和文字
 winuser.h  窗口控件等函数
 winnt.h    提供Unicode支持

 kernel.lib  提供进程/线程/内存等API函数支持
 user32.lib  包括窗口/界面等
 gdi32.lib   提供绘图/文字等

5. Win32 窗口程序
L--long
P--pointer
C--const
STR--字符串
T-TCHAR - char

LPCTSTR ==>const char*


#include<windows.h>
int WINAPI WinMain( HINSTANCE hInstance,     //应用程序的句柄,每个应用程序有一个句柄
             HINSTANCE hPrevInstance, //该应用程序前一个实例句柄
           LPSTR pszCmdLine,       //命令行参数
             int nShowCmd)       //窗口显示方式
{
 return 0;
}
//WINAPI 为函数调用方式 _stdcall

int MessageBox(
  HWND hwnd,  //窗口句柄
  LPCTSTR lpText, //文本内容
  LPCTSTR lpCaption,  //消息框标题
  UINT uType);   //对话框按钮 //MB_OK..

6.利用cmd编译连接
  用记事本编写.c函数
  VC98\Bin下VCVARS32.BAT在cmd窗口中运行
  切换到.c目录 lc xxx.c /c
        link xxx.obj user32.lib
7.查看帮助CL -?   LINK -?
CL常用选项
/c 只编译不连接
/TC 编译c文件
/TP 编译c++文件  //如果不指定,CL根据文件类型自动区分
/I 头文件所在路径(include)
CL编译器字符大小写敏感
LINK常用选项
/out:文件名  连接成制定文件名的程序
/LIBPATH:LIB 文件存放的路径
/SUBSYSTEM:CONDOLE/WINDOW  以何种方式编译
LINK连接器中字符大小写不敏感

三、真正的窗口程序//

1.入口函数WinMain
2.窗口处理函数
3.注册窗口类型
4.创建窗口
5.显示窗口
6.消息处理

///

2.窗口处理函数
static LRESULT CALLBACK WindowProc(
HWND hWnd, //窗口的句柄
UINT uMsg,  //消息的ID号
WPARAM wParam,  //消息对应的参数
LPARAM lParam ); //消息对应的参数

3.注册窗口WNDCLASS
typedef struct _WNDCLASS {
 UINT style;   //窗口类风格
 WNDPROC lpfnWndProc;   //窗口处理函数
 int cbClsExtra;  //窗口类附加数据大小
 int cbWndExtra;  //窗口附加数据大小
 HANDLE hInstance;  //当前应用程序的实例句柄
 HICON hIcon;   //窗口图标
 HCURSOR hCursor;  //窗口光标
 HBRUSH hbrBackground;  //窗口背景画刷
 LPCTSTR lpszMenuName;  //菜单
 LPCTSTR lpszClassName; //类型名称
} WNDCLASS ;

4.创建窗口  //返回值为一个窗口的句柄
HWND CreateWindow(
  LPCTSTR lpClassName,  // 注册的窗口类型名
  LPCTSTR lpWindowName, // 窗口名称
  DWORD dwStyle,        // 窗口类型
  int x,                // 窗口左上角x坐标
  int y,                // 窗口左上角y坐标
  int nWidth,           // 窗口宽度
  int nHeight,          // 窗口高度
  HWND hWndParent,      // 父窗口句柄
  HMENU hMenu,          // 窗口菜单句柄
  HINSTANCE hInstance,  // 应用程序实例句柄
  LPVOID lpParam        // 创建的参数,一般为空
);

5.显示和更新窗口
BOOL ShowWindow(
 HWND hWnd,    //窗口句柄
 int nCmdShow  //显示的方式
);
BOOL UpdateWindow(
 HWND hWnd     //要刷新的窗口句柄
);
//防止被其他窗口覆盖

6.消息处理
GetMessage()       //获取消息
DispatchMessage()  //派发消息

BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);

LONG DispatchMessage(
const MSG *lpmsg
);

7.程序退出
窗口销毁时,退出程序,在WndProc中实现
WM_DESTROY       //窗口销毁时调用WndProc传递给使用者
PostQuitMessage  //发送一个退出消息

void PostQuitMessage(
int nExitCode );

详细实现:

#include<windows.h>

HINSTANCE g_hInst=NULL; //定义一个全局变量,存放程序句柄,初始化为空

//2 窗口处理函数

LRESULT CALLBACK WndProc(HWND hWnd,    //窗口句柄
   UINT nMsg,     //消息ID
   WPARAM wParam, //消息对应的参数
   LPARAM lParam) //消息对应的参数
{
//程序退出
 switch(nMsg)         //判断消息ID
 {
  case WM_DESTROY:        //窗口销毁信息
   PostQuitMessage(0); //发送退出消息
   break;
  return 0;
 }
 return DefWindowProc(hWnd,nMsg,wParam,lParam);
}

//3 注册窗口类型

BOOL MyRegister(LPSTR pszClassName)
{
//构造注册窗口的参数
 WNDCLASS wc={0};
 ATOM nAtom =0;
 wc.style         =CS_VREDRAW;
 wc.lpfnWndProc   =WndProc;
 wc.cbClsExtra    =0;
 wc.cbWndExtra    =0;
 wc.hInstance     =g_hInst;
 wc.hIcon         =LoadIcon(g_hInst,MAKEINTRESOURCE(100));
 wc.hCursor       =NULL;
 wc.hbrBackground =(HBRUSH)(COLOR_BTNFACE);
 wc.lpszMenuName  =NULL;
 wc.lpszClassName =pszClassName;
//注册窗口
 nAtom = RegisterClass( &wc ); 
/*      if(0==nAtom)
 {
  MessageBox(NULL,"窗口注册失败","error",MB_OK|MB_ICONWARNING);
  return FALSE;
 }
 else
 {
  MessageBox(NULL,"窗口注册成功","sucessed",MB_OK);
 }
*/
 
 return TRUE;
}

//4 窗口创建

HWND MyCreate(LPSTR pszClassName)
{
 HWND hWnd=CreateWindow(
          pszClassName,
   "HelloWnd",
   WS_OVERLAPPEDWINDOW,
   400,
   250,
   500,
   300,
   NULL,
   NULL,
   g_hInst,
   NULL);
/* if(hWnd==NULL)
 {
  MessageBox(NULL,"窗口创建失败","error",MB_OK);
  return NULL;
 }
 else
 {
  MessageBox(NULL,"窗口成功创建","succeed",MB_OK);
  return NULL;
 }
*/
 return hWnd;
}

//5 显示窗口

void DisplayWnd(HWND hWnd)
{
 ShowWindow(hWnd,SW_SHOW);
 UpdateWindow(hWnd); 
}

//6 消息处理

void Message()
{
MSG msg={0};
//消息循环处理,获取消息
while ( GetMessage(&msg,NULL,0,0) )
{
//派发消息
 DispatchMessage(&msg);
}
}

//1 入口函数

int WINAPI WinMain( HINSTANCE hInst,    
             HINSTANCE hPrevInst,
           LPSTR pszCmdLine,      
             int nShowCmd)     
{
 g_hInst=hInst;     //全局变量g_hInst存放程序句柄
 MyRegister("MyWnd");     //注册窗口类型
 HWND hWnd=MyCreate("MyWnd");    //创建注册类型的窗口
 DisplayWnd(hWnd);      //显示窗口
 Message();       //消息处理
 return 0;
}

四 资源的处理

1.资源和资源脚本
资源:ICON/CUSRUR/BITMAP/MENU
资源脚本:扩展名为.rc的文件

2.编译资源
rc.exe编译资源,生成RES文件

3.链接资源
使用link.exe将RES文件链接到程序中

资源脚本编写
新疆.rc文件,打开文件,写入
资源编号 ICON "window.ico"    //资源编号 资源类型 资源名
编译生成.res
连接程序与资源脚本 link xx.obj xx.res user32.lib
将obj与res文件放在同一路径下
ICON的使用--加载程序图标函数:LoadIcon(g_hInst,MAKEINTRESOURCE(ICON的ID号));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值