Windows c语言自学教程(二)

来源:互联网 发布:淘宝网店没上货被收回 编辑:程序博客网 时间:2024/06/09 18:44

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类型的值。


未完,待续!