2、入门,窗口和函数初体验
开篇:以visual 2010英文版为准哈,其实无所谓,常用功能就那么多。属于计算机基础英语,很好理解。中文版功能操作位置也没有区别,不影响使用和编译。对于链接有些是英文的,尤其是msdn很多,这个可用翻译软件翻译,无论在线的还是不在线的,最好挂专业词库,或者自己度娘,谷歌,bing一下中文资料,一样的
开始: visual 编译器安装完毕后,默认工程根目录为”我的文档\visual xxxx“。 新建工程选择,右键单击左侧工具栏 “solution explorer”选择“add”再选择“new item”谈出的对话框,选择 "c++ file (.cpp)",在输入"项目文件名.c" 后(注意输入文件后缀.c),选”ok“.
代码:
#include <windows.h> //windos库文件,此文件是windows程序基础定义内容。
int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdLine) { return 0;
}
WINMAIN()的定义说明 相当于main主调用函数,程序的入口函数。 APIENTRY WINAPI 是其调用回调方式以及返回值基本属于固定格式(可省略,此处省略),其中int返回值如果没有可以设置成void。常用到的参数主要是szcmdline 和icmdline 。是程序中开关选项参数,。
简明说明
HINSTANCE hInstance, // 当前的实例
HINSTANCE hPrevInstance, //先前的实例
LPSTR lpCmdLine, // 指针型的命令行的参数
int nCmdShow // 显示窗口的状态(最大化、最小化、隐藏)
整个程序下来也就27KB。用gcc for windows的,值会有偏差,但应该不会太大。如果你用vc编出的程序与我的体积偏差很大,那就说明兄弟你种彩了。赶紧杀毒吧。
当然也可以写标准c
int main()
{
return 0;
}
也可以的。而且由于不调用windows 接口定义。连#include都省了。
深入:这个啥都不干,如同奶牛光吃草不产奶,那怎么能成。加点内容!可以,对话框大战好不!
#include <windows.h> void main() {
char txt[255];//最大字符数
int ret;
HWND hwnd =GetDesktopWindow();
MessageBox(hwnd,TEXT("本内容改编自赵本山小品卖拐第三部"),TEXT("无恶意版权声明,欢迎请喝茶或hot coffee"),MB_OK); ret =MessageBox(hwnd,TEXT("有一天,有个人要吃肉,问是要吃猪肉还是吃驴肉还是吃羊肉,请回答?yes 猪,no驴,cancel 羊"),TEXT("请回答"),MB_YESNOCANCEL); strcpy(txt,"你是禽兽不如还是不如禽兽?"); if (IDYES ==ret) { strcpy(txt,"恭喜你答对了,羊和驴也是这样想的!"); } if (IDNO == ret){ strcpy(txt,"恭喜你答对了,猪和羊也是这样想的!"); } if (IDCANCEL == ret ) { strcpy(txt,"恭喜你答对了,猪和驴也是这样想的!"); } MessageBox(hwnd,txt,"答对了!",MB_OK); }
知识点: 因为不涉及窗口初始化和事件回调,所以 void main()就可以了。HWND是句柄结构体,是确认程序上层单位程序标志。 GetDesktopWindow()函数就是获取当前桌面句柄,并返回句柄的值,比较单纯的函数。strcpy ,对于c最大的遗憾和不便就是他居然没有字符串的概念。想用字符串,必须借助指针或者数组。strcpy函数就是字符串赋值,strcpy(要赋值的字符变量,字符串常量);当然这个函数,因为有安全性问题,微软已经不推荐使用,编译器也会警示,不过本例中是没有问题的。最主要的函数MessagBox(句柄(空设置 NULL),对话框内容字符串,对话框标题字符串,按钮 | 话框图标选项 | 模态模式) ;
诡异的语法错误,开始时,总是报语法错误syntax error : missing ';' before 'type'错误。可是我的语法肯定木问题。于是,我百度了一下。发现这是vc特有的。变量声明必须在开头,否则就报错,这倒是可以培养不错的编程习惯。不过gcc貌似没有发现这个问题,我有点喜欢vc2010了。
深入:这个太单调了,啥都没做,一堆对话框,有木有。那么接下来,我们就该 哈喽,world了。
#include <windows.h> LRESULT CALLBACK _Test_WndProc (HWND, UINT, WPARAM, LPARAM) ;//声明窗口过程函数 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { //Windows程序入口函数,功能类似C语言的main()函数 static TCHAR szAppName[] = TEXT ("你好!!!") ; //窗口类标题 static 静态 HWND hwnd; MSG msg; WNDCLASS wndclass; //定义一个WNDCLASS型结构 UINT nWight = 300; //窗口宽度 UINT nHeight = 400; //窗口高度 wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口大小发生变化时自动刷新 wndclass.lpfnWndProc = _Test_WndProc ; //设置窗口过程(fnp) 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 ; //指定窗口菜单项NULL为空 wndclass.lpszClassName = szAppName ; //窗口类名称,这里指想字符串数组 if (!RegisterClass (&wndclass)) //注册窗口类 { MessageBox (NULL, TEXT ("程序运行失败!"),szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // RegisterClass注册的窗口类名 TEXT ("你好鸭!给母鸡!鸭梨好大!"), // 窗口标题 随意,不要见怪,受倭瓜国影响,你们懂得(这个词没有贬义的意思,你们更懂得) WS_OVERLAPPEDWINDOW, // 窗口样式 * CW_USEDEFAULT, // int x 窗口打开的X坐标 CW_USEDEFAULT, // int y 窗口打开的Y坐标 nWight, // int nWidth----窗口宽 nHeight, // int nHeight---窗口高 NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; //在显示器上显示窗口 UpdateWindow (hwnd) ; //绘制窗口 while (GetMessage (&msg, NULL, 0, 0)) { //消息循环 TranslateMessage (&msg) ; //将击键消息转换为字符消息 DispatchMessage (&msg) ; //将消息回传给Windows,由Windows转发给适当的窗口过程 //这里的窗口过程为WndProc()函数 } return msg.wParam ; } LRESULT CALLBACK _Test_WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //窗口过程函数 HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_PAINT: //InvalidateRect(hwnd,NULL,TRUE); hdc = BeginPaint (hwnd, &ps) ; //创建设备描述表句柄 GetClientRect (hwnd, &rect) ; SetTextColor(hdc,RGB(128,128,128)); DrawText (hdc, TEXT ("快乐的鸭子!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; SetTextColor(hdc,RGB(255,0,255)); DrawText (hdc, TEXT ("甜蜜蜜"), -1, &rect, DT_SINGLELINE ) ; SetTextColor(hdc,RGB(255,255,0)); TextOut(hdc,100,10,TEXT("柠檬tree!"),9); SetTextColor(hdc,RGB(0,255,255)); TextOut(hdc,200,10,TEXT("山楂树!"),7); EndPaint (hwnd, &ps) ; //释放设备描述表句柄 return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; //处理所有窗口过程不予处理的消息
}
对于上面的表示不解的大有人在,我也一样,对于其中的参数和选项,可以参照微软的官方说明,只不过在于其选项参数或结构体不同,会有一些功能上的差异,现在还不必深究,下章节会有阐述,具体的说明可以查看微软msdn官方说明。为此人和语言也是多余的,上流程图比较直观些。
用画图画的,不太好看,勉强看吧
再深入:上面的一个窗体,可以完成了基本动作,而且可以显示字体,在指定的位置显示指定的字符。下面将会具体说明窗口操作的一些函数。这个其实也不用多说,函数体声明是 返回值类型 函数名称(类型 参数1,类型 参数2,类型 参数n......);函数体的调用是 返回值= 函数名(参数1,参数2,参数n.....);参数和返回值类型可以是系统原型定义或者为结构体,指针均可。以 hdc = BeginPaint (hwnd, &ps) ; 为例。句柄hdc是一个结构体,其实就是个指针, BeginPaint () 是函数名称,hwnd, &ps 是他的两个参数名称。可以看到 hwnd也是个句柄。和他有相似功能的还有GetDC。他们的区别请参见此处文章 http://hi.baidu.com/joyeep/blog/item/d60c9351daabed19367abeaf.html 。GetClientRect (hwnd, &rect) ;获取可绘画窗口区域,这个区域内才可以绘画。SetTextColor(hdc,RGB(128,128,128));设置绘画输出字体颜色,
COLORREF SetTextColor( HDC hdc, COLORREF crColor );参数内嵌了RGB函数,并返回
COLORRE类型的值。
未完,待续!