Windows 程序设计笔记.docx
- 文档编号:29860377
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:27.38KB
Windows 程序设计笔记.docx
《Windows 程序设计笔记.docx》由会员分享,可在线阅读,更多相关《Windows 程序设计笔记.docx(23页珍藏版)》请在冰豆网上搜索。
Windows程序设计笔记
windows程序设计笔记1
windows.h中包含了许多其他的头文件
主要是WINUSER.H 使用者界面
WINBASE.H kernel函数
WINDEF.H 一些类型的define
WINNT.H 支持UNICODE形态定义
WINGDI.H 包含图形界面函数
应用程序的入口函数
int WINAPI WinMain //WINAPI #define WINAPI _stdcall 标准调用约定很多语言都是用的这种调用约定
(HINSTANCEhInstance, //实例的句柄用于唯一标示应用程序
HINSTANCEhPrevInstance, //先前实例的句柄在win32下为0已经被摒弃
LPSTRlpCmdLine, //commandline
intnShowCmd); /窗体的显示方式
UNICODE是为了解决ASCII不能表示所有语言的问题
Windows程序设计1、2章
windows.h中包含了许多其他的头文件
主要是WINUSER.H 使用者界面
WINBASE.H kernel函数
WINDEF.H 一些类型的define
WINNT.H 支持UNICODE形态定义
WINGDI.H 包含图形界面函数
应用程序的入口函数
int WINAPI WinMain //WINAPI #define WINAPI _stdcall 标准调用约定很多语言都是用的这种调用约定
(HINSTANCEhInstance, //实例的句柄用于唯一标示应用程序
HINSTANCEhPrevInstance, //先前实例的句柄在win32下为0已经被摒弃
LPSTRlpCmdLine, //commandline
intnShowCmd); /窗体的显示方式
UNICODE是为了解决ASCII不能表示所有语言的问题
wchar_t 原型 typedef wchar_t unsigned short ; //占2个字节也就是16位 宽字 32位下
wchar_t*p=L"DSAFAFD"; //L是long 告诉编译器使用每一个字符占2个字节
wchar_tc=L'p'; //定义宽字节字符即使不加L那么编译器也默认将她设置为2个字节
wcslen 求宽字节字符串的长度不包括'\0'
wprintf 是printf的宽字原版
对应就有wscanf 这个是再 WCHAR.H中定义的
但是 有时候我们的程序需要单字节也需要双字节那么wchar_t和char的 混合就混乱了由于处理的函数不用我们希望有一个可以同时处理他们的类型
TCAR 如果定义了_UNICODE识别字那么就是 typedef wchar_t TCHAR 如果没定义的typedef charTCHAR
具体看TCHAR.H源文件
#define_T(x) __T(x)
#define_TEXT(x) __T(x)
在TCHAR.H中这样定义了 就是说我们可以用 _T __T _TEXT中的任意一种 。
对应求字符个数的函数就是 _tcslen()
如果定义了_UNICODE 那么就是 #define _tcslen wcslen 否则 #define _tcslen strlen
如果要使用_UNICODE识别那么就在Project ->Setting->c/c++Language->PreprocessorDefinition中加上_UNICODE那么系统的就会默认使用_UNICODE识别类型
在WINNT.H中增加了新的类型定义 CTYPE.H中定义了wchar_t 为unsignedint
typedef char CHAR ;
typedef wchar_t WCHAR ;
实际上MessageBox这个函数并不是真正的消息框原型
在WINUSER.H中我们找不到MessageBox的函数定义 也就是说没有MessageBox的函数进入点但是我们发现
有MessageBoxA和 MessageBoxW这两个函数一个表示单字节一个表示宽字 我们在使用时直观调用 MessageBox就行了因为
#ifdefUNICODE
#defineMessageBox MessageBoxW //如果定义了UNICODE那么就是用MessageBoxW
#else
#defineMessageBox MessageBoxA
#endif//!
UNICODE 非UNICODE 的时候调用的是MessageBoxA
这样的好处是一旦定义了UNICODE那么全都是UNICODE表示MessageBoxW否则就是 MessageBoxA
还有windows定义了一组与C语言字符串处理函数相当的函数
ILength=lstrlen(pString);
pString=lstrcpy(pString1,pString2);
pString=lstrcpyn(pString1,pString2,iCount);
pString=lstrcat(pString1,pString2);
iComp=lstrcmp(pString1,pString2);
iComp=lstrcmpi(pString1,pString2);
这些函数其实和 TCHAR 一样的用法如果定义了UNICODE 就是那么这些函式将接受宽字串,否则只接受常规字串。
windows中不可以使用 printf但是可以使用sprintf进行格式化文本
intsprintf(char*szBuffer,constchar*szFormat,...)
{intiReturn;va_listpArgs;
va_start(pArgs,szFormat);
iReturn=vsprintf(szBuffer,szFormat,pArgs);
va_end(pArgs);
returniReturn;
}
标准版sprintfswprintf_stprintf
我们可以对宽字单字节的字符进行格式化
Windows程序设计3、4章笔记
#include"windows.h"
#include"stdio.h"
#include"stdlib.h"
#include"resource.h" //预编译我们的资源文件
#include"tchar.h"
LRESULTCALLBACKMyProc(
HWNDhwnd,
UINTuMsg,
WPARAMwParam,
LPARAMlParam
);
intWINAPIWinMain(
HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow
)
{ HWND hWnd;
MSG msg;
staticTCHARszAppName[]=TEXT("NewWindow");//窗口类名
WNDCLASS cls;
cls.cbClsExtra=0;
cls.cbWndExtra=0;
cls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
cls.hCursor=LoadCursorFromFile("resource\\xx.ani");
cls.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
cls.hInstance=hInstance;
cls.lpfnWndProc=MyProc;
cls.lpszClassName=szAppName;
cls.lpszMenuName=NULL;
cls.style=CS_HREDRAW|CS_VREDRAW|0x00020000; //CS_DROPSHADOW 0x00020000在 vc6以及以前的版本中没有定义我们可以自定义这个窗体有阴影
RegisterClass(&cls);
hWnd=CreateWindow("NewWindow","SDK_WindowDemo",WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|WS_SYSMENU,200,200,500,400,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0)) //获得消息后面2个参数为0会接受任何win32消息
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息
}
return 0;
}
LRESULTCALLBACKMyProc(
HWNDhwnd,
UINTuMsg, //win32消息的类型
WPARAMwParam, //第一个附加参数
LPARAMlParam //第二个附加参数一般是值
)
{
switch(uMsg)
{
caseWM_PAINT:
//UpdateWindow函数的调用会进入这个消息响应
{
HDCdc;
PAINTSTRUCTps;
dc=BeginPaint(hwnd,&ps);
SetTextAlign(dc,TA_LEFT|TA_TOP);//设置基点的位置。
。
也就是坐标(0,0)
TextOut(dc,60,60,_T("GameWnd"),lstrlen(_T("GameWnd")));//include TCHAR.H HeadFile
EndPaint(hwnd,&ps);
return0;
}
caseWM_CREATE:
//当窗体创建的时候是窗口过程接受的第一个消息
{
// SetWindowLong(hwnd,GWL_STYLE,(GetWindowLCong(hwnd,GWL_STYLE)&~WS_CAPTION)); //SetWindowLong设置窗体的style
SetScrollRange(hwnd,SB_HORZ,0,100,FALSE); //SetScrollRange设置滚动条的范围是min-max
SetScrollPos(hwnd,SB_HORZ,50,FALSE); //SetScrollPos设置滚动条的位置是相对与min-max中的位置 最后一个参数设置为false表示不需要重绘
//InvalidateRect会使客户区域变为InvalidArea从而向消息队列中加入 WM_PAINT消息但始终合格消息的优先级较低但是我们可以调用UpdateWindow立即更新窗口
//也就是说在调用了InvalidateRect时候接着调用UpdateWindow才会立即重绘
//新的函数GetScrollInfo和GetScrollInfo函数可以完成上述四个函数的功能具体应用MSDN
return 0;
}
caseWM_CHAR:
{
if('Q'==(char)wParam)
if(IDYES==MessageBox(hwnd,_T("是否要退出?
"),_T("提示"),MB_YESNO))
{
DestroyWindow(hwnd); //销毁窗体
}
return0;
}
caseWM_DESTROY:
{
PostQuitMessage(0); //向消息队列中发送一个退出消息
return0;
}
}
returnDefWindowProc(hwnd,uMsg,wParam,lParam); //返回缺省的窗口过程
}
windows程序设计第五章笔记GDI
(1)
我们在对windows设备进行绘图操作的时候要用到 GDI 函数 并且要获取设备的DC也就是设备的代号
如果是响应WM_PAINT消息那么我们利用
BeginPaint
.......code
EndPaint
获取设备上下文代号
如果处理的不是WM_PAINT消息 那么就利用
GetDC
.....code
ReleaseDC //释放DC
如果我们要获取整个视窗的DC那么用GetWindowDC
如果要获取ClientArea的DC那么用GetClientDC 来获取但是最后都要掉哟过ReleaseDC来释放设备上下文
在MSDN我们可以看到 我们在GetDC后 一定要调用ReleaseDC而一定不能调用DeleteDC
DeleteDC是在CreateDC后调用的。
。
。
。
。
hdcMem=CreateCompatibleDC(hdc); //兼容DC
其他行程式
DeleteDC(hdcMem);
hdcMeta=CreateMetaFile(pszFilename);
其他行程式
hmf=CloseMetaFile(hdcMeta)
intGetDeviceCaps(HDChdc,//handletoDCintnIndex//indexofcapability); 获得设备的信息
SetPixel 绘制一个点
GetPixel可以返回指定设备指定坐标上的点的颜色
BOOLPolyline( //这个函数的功能是可以将多个点连续的画起来
HDChdc,//handletodevicecontext
CONSTPOINT*lppt,//arrayofendpoints //POINT结构体数组
intcPoints//numberofpointsinarray); //POINT结构体数组的个数
Rectangle、矩形
Ellipse、 绘制椭圆
RoundRect 绘制一个边角圆滑的椭圆
BOOLRoundRect(
HDChdc,//handletoDC
intnLeftRect,//x-coordofupper-leftcornerofrectangle
intnTopRect,//y-coordofupper-leftcornerofrectangle
intnRightRect,//x-coordoflower-rightcornerofrectangle
intnBottomRect,//y-coordoflower-rightcornerofrectangle
intnWidth,//widthofellipse //值越大边角就越明显
intnHeight//heightofellipse); //值越大边角就越明显
Chord 绘制一个弦
Pie 饼图函数绘 制一个扇形楔,由一个椭圆形和两个子午线轮胎的交集范围内。
通过使用当前画笔的馅饼概述,并通过使用当前画笔填充。
Arc 绘制一个椭圆弧
PolyBezier贝塞尔曲线
PolyBezierTo也是画贝塞尔曲线
在绘制线的时候对画笔的设置
HPEN pen;
pen=GetStockObject(WHITE_PEN);
SelectObject(hdc,pen) ;//这样就为我们的设备上下文设置了白色的画笔 选择的时候必须用GetStockObject获取画笔
受限与windows的几种画笔我们可以通过函数创建自己的画笔
CreatePen 或者CreatePenIndirect 使用完了之后我们需要DelectObject删除逻辑画笔 这是一种GDI物件
其他的物件有其他五种是画刷、点阵图、区域、字体和调色盘。
除了调色盘之外,这些物件都是通过SelectObject选进装置内容的。
hPen=CreatePen(PS_DASH,1,RGB(122,233,55));
SelectObject(hdc,hPen); //这个例子创建了一个浅绿色的画笔
DeleteObject(hPen); //删除创建的GDI物件也就是逻辑画笔
ClentToScreen是客户坐标到屏幕的转换
ScreenToClient是屏幕到客户的转换
GetWindowRect是相对于屏幕的左上角的(0,0)
创建逻辑画笔的第二种方法
LOGPENlogpen;
hPen=CreatePenIndirect(&logpen);
DeleteObject(logpen); //可以在响应WM_DESTROY的时候删除画笔
intGetObject(
HGDIOBJhgdiobj,//handletographicsobject
intcbBuffer,//sizeofbufferforobjectinformation
LPVOIDlpvObject//bufferforobjectinformation
);
这个函数的用法是如果我们有位图或者画笔或者。
。
的句柄那么我们能获得对应的GDI对象的信息
如果需要目前选进装置内容的画笔代号,可以呼叫:
也就是我们要获取当前设备的画笔句柄 也可以获取其他句柄具体看MSDN函数的介绍
hPen=GetCurrentObject(hdc,OBJ_PEN);
在画虚线的时候我们也可以用SetBkColor填充虚线的空白地方
SetBkMode(TRANSPARENT);会设置背景模式为透明的。
。
GetBkMode 可以获取现在的背景模式 也就是返回SetBkMode设置的背景参数
GetObject喝GetCurrentObject的区别 GetObject是通过句柄获取设备的属性 GetCurrentObject是获取当前设备的句柄 通过参数 。
。
函式
图形
Rectangle
直角矩形
Ellipse
椭圆
RoundRect
圆角矩形
Chord
椭圆周上的弧,两端以弦连接
Pie
椭圆上的圆形图
Polygon
多边形 MSDN
PolyPolygon
多个多边形N个
SetPolyFillMode(hdc,iMode);设置多边形填充模式
如果我们要对背景进行填充那么就要创建画刷了画刷句柄HBRUSH可以用到CreateSolidBrush(crColor);函数和
CreateHatchBrush(iHatchStyle,crColor);带斜线的画刷
hBrush=CreateBrushIndirect(&logbrush);间接的创建画刷
如果要取得画刷的信息一样可以调用GetObject来实现
我们还可以选择坐标的映射方式
SetMapMode(hdc,iMapMode) //那么我们可以设置xy坐标的初始起点
同样有Set就对应有GetMapMode
还有一些常用的函数
GetTextExtend 获取一段文本的信息
GetTextMetrics 获取系统文本度量
GetSystemMetrics获取系统的度量
GetDeviceCaps获取设备信息
GetCursorPos获取鼠标位置
SetCursorset鼠标位置
MoveWindow移动窗体
GetWindowRect
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 程序设计笔记 程序设计 笔记