Windows c语言自学教程(二)

2 篇文章 0 订阅
2 篇文章 0 订阅

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


未完,待续!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值