win32第二天

对WinMain中命令行参数的试验,跟main函数一样。只是一个字符串
#include "windows.h"
int WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL,lpCmdLine,"Infor",MB_ABORTRETRYIGNORE|MB_ICONERROR);
return 0;
}
可以把一个文件直接拖入到.exe 后缀的文件当中,最直接的例子就是播放器,其中通过命令行参数获取到了是刚才那个文件的全路径 。、
编写资源的文件---.rc资源脚本文件
编译rc文件----rc.exe
将资源链接到程序中----link.exe
通过如此修改程序图标,改成一幅图片 ,图片要求.ico后缀。
1.将small.ico复制到当前文件当中。
2.新建一个脚本文件HelloWnd.rc
3.用记事本打开,输入如下:
100 ICON small.ico
保存关闭,手动删除.exe和.obj文件
cmd--切换路径
cl.exe /c hellownd.c
rc.exe hellownd.rc
会发现多出一个.res的文件,里面也存了汇编的东西,
link.exe hellownd.obj hellownd.res user32.lib
可以发现我们已经把应用程序的图标改掉啦。嘻嘻。搞定一个小任务。
但是一运行我们没办法结束,还得杀掉进程。


NMAKe是Makefile一个解释执行的工具,根据Makefile文件中的定义,编译和链接程序最终生成目标文件,类似天批处理文件。
Makefile(以.mak为后缀的文件)
定义编译和链接等操作的脚本文件(把项目的处理命令写入),一般对整个项目进行编译链接处理。
实验如下:还在当前文件夹中,删掉中间文件留下最原始的文件。
新建一个.mak的文件(注意有空格)。
HELLO:(依赖行)
  cl.exe /c hellownd.c
  rc.exe hellownd.rc
  link.exe hellownd.obj hellownd.res user32.lib
如果想运行Makefile文件需要用一个命令NMAKE
一个.mak文件可以有多个依赖行。
HELLO:
  cl.exe /c hellownd.c
  rc.exe hellownd.rc
  link.exe hellownd.obj hellownd.res user32.lib
CLEAN:
del *.obj
del *.res
del *.exe
默认情况下只执行第一个依赖行的命令,而不执行其它依赖行的命令,如果想执行其它依赖行的命令,
nmake /f hellownd.mak CLEAN
HELLO:CLEAN便先执行CLEAN依赖行中的命令,HELLO为依赖行,CLEAN为依赖项。
 字符
新建一个Win32 console Application
工程名:wincharacter
void C_char(){
char *pszText="hello character";
printf("%s\n",pszText);
}
stdafx.h中包含系统版本信息,必须放在第一个包含,以它打头。
字符的编码方式:
ASC码
7位表示一个字符,128个
ASCII码
8位表示一个字符,256个
UNICODE码
在Windows平台下,采用2字节表示一个字符
计算机的主流编码早晚会是UNICODE码。
打印出所有的ASCII编码:
void ascii(){
char nchar=0;
for(int i=0;i<256;i++){
printf("%c ",nChar);
nChar++;
}
}
执行出来后128个全是?,后面是中文代码页,中文是两个字节一起,所以是?。应该两个字节一起打印才行。
设置控制台下,输出的代码页
BOOL SetConsoleOutputCP(
UINT wCodePageID);(437为英文页)
936为中文页


宽字节字符
wchar_t每个字符占两个字节
char 每个字符占1个字节
wchar_t实际是unsigned short类型,定义时需要增加"L",通知编译器按照双字节编译字符串,采用UNICODE编码。
wchar_t *pwsztext=L"Hello wchar";
wprintf(L"%s\n",pwszText);


unicode字符打印
void PrintUnicode(){
HANDLE hStd=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出
wchar_t nchar=0;
for(WORD nHigh=0;nHigh<256;nhigh++){
for(WORD nLow=0;nLow<256;nLow++){
nChar=nHigh*256+nLow;
WriteConsole(hStd,&nChar,1,NULL,NULL);
}
printf("\n");
}
}


窗口程序的创建步骤
定义WinMain函数
定义WindowProc窗口处理函数
注册窗口类
RegisterClass
创建窗口
CreateWindow
显示窗口
ShowWindow/UpdateWindow
消息循环
GetMessage
TranslateMessage
DispatchMessage
消息处理


窗口类
窗口类是包含了窗口各种参数信息的数据结构,每个窗口都具有窗口类,基于窗口类创建窗口,每个窗口类都具有一个名称,使用前必须注册到系统。
窗口类的分类
1.系统窗口类
系统已经定义好的窗口类,所有应用程序都可以直接使用。
应用程序全局窗口类
由用户自己定义,当前应用程序所有模块都可以使用。
应用程序局部窗口类
由用户自己定义,当前应用程序本模块都可以使用。


系统窗口类不需要注册,直接使用窗口类即可,系统已经定义好的相应名称,例如:
按钮button,编辑框edit
新建Win32 Application程序,工程名WinSysReg
#include "stdafx.h"
HINSTANCE g_hInstance=0;


void SysReg(){
HWND hCtrl=CreateWindow("BUTTON","ok",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,g_hInstance,NULL);
ShowWindow(hCtrl,SW_SHOW);
UpdateWindow(hCtrl);
MSG nMsg;
while(GetMessage(&nMsg,NULL,0,0)){
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}


int WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
{
g_hInstance=hInstance;
SysReg();
return 0;
}
以上是一个巨大的按钮,以下是一个巨大的文本编辑框。
CreateWindow("EDIT","ok",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,g_hInstance,NULL);


详细介绍RegisterClass/RegisterClassEx
带Ex的为加强版
ATOM(unsigned short) RegisterClass(
CONST WNDCLASS *lpWndClass);
ATOM RegisterClassEx(
CONST WNDCLASSEX *lpwcx);
注册成功后返回一个非0.


typedef struct_WNDCLASSEX{
UINT cbSize;//结构休的大小(sizeof)
UINT style;//窗口类的风格
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口类的附加数据buffer
int cbwndExtra;//窗口类的附加数据
HINSTANCE hInstance;//当前模块的实例句柄
HICON hIcon;//窗口图标句柄
HCURSOR hCursor;//鼠标的光标句柄
HBRUSH hbrBackground;//绘制背景的画刷句柄
LPCTSTR lpszMenuName;//窗口菜单的资源ID字符串
LPCTSTR lpszClassName;//窗口内名称
HICON hIconSm;//窗口小图标句柄
}WNDCLASSEX,*PWNDCLASSEX;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值