沧桑不尽
无穷的沧桑,不尽的落叶

 

    继续说明:本来蛮有信心的想把这个东西在工作前按照计划写完,可是才上来两篇,就有不少朋友看了说“被骗了”,我也感到无奈与郁闷,打击了我的信心,于是就停了下来,现在工作了,晚上是有时间,也有一些朋友给我留言和发邮件说让我继续,感觉这些东西应该还是有点用的吧,不过只要是对新手的。所以在这里在声明一次,这个系列的文章的读者是新手朋友,如果您是高手,请千万别看了,一来浪费您宝贵的时间,而来,如果您只是说文章不好,又不给提出让我提升的意见,无疑是打击俺脆弱的心灵,高手不要骂我,呵呵(我现在的工作也就是做这块的)

 

1.4 鼠标指针特效

 

 

大家在都玩过网络游戏吧,里面的界面都是很吸引人的,好的界面的确能给人以美的感受。而里面的鼠标并不是我们平常见到的箭头了,而是独具匠心的。
网游我就只玩过魔域,所以就以魔域为例,魔域中的鼠标是这样的 今天我们就来实现让鼠标到程序窗口上就变为我们想要的图案。在写代码之前,
我们还是先来看下先驱知识,这里要说的就是上节说资源了,当时大家看了可能并不知道什么是资源,这里就详细说一下。
大家知道Windows程序都有图标,鼠标有光标,窗口上有图片、按钮、文字等等,这些都是程序的部分,这样就是程序的资源。程序没有进入内存运行的时候,
我们就叫它可执行文件吧,在磁盘保存的时候,并不只是保存了程序运行的代码部分(即cpu指令部分),还有一些图片、字符、按钮、图标并不是在代码段的。
可执行文件的大致机构如下图

 

 

一个可执行文件是很复杂的,这里就简单的画这么一个难看的图,知道资源所在的大概位置,能理解程序的执行部分和知道程序的图标是从哪来的就可以了。
今天我们只是修改鼠标的指针,所以用到的资源,只有鼠标的光标资源而已。资源的源文件是以rc为扩展名的脚本文件(仍然是C语言格式的,很简单),
有资源编译器Rc.exe编译成以res为扩展名的二进制资源文件,最后用连接器,把res文件和obj文件连接到一起就成了我们的程序exe文件了,现在知道了程序编译后要连接了吧。
光标的图片格式有两中curani的。这个文件我在魔域的图片库里面找到了就复制到,当前项目目录下。下面来定义下资源文件myOwnCursor.rc

 

//myOwnCursor.rc written by xhk 2009.3.1
#include    <resource.h>  //资源文件要用到的图文件
#define    CUR    0x1000        //定义资源的ID,为整型id
CUR    CURSOR     
"myOwnCursor.ani"    //用到的光标图案

 

 

 

写完后,在命令提示符下进入目录,然后用rc.exe编译,输入rc myOwnCursor.rc命令,回车

 

我们查看下项目目录下多了个myOwnCursor.RES的文件,就是编译生成的二进制资源件。

 

接下来就该编写代码了,来应用这个资源文件,建立myOwnCursor.c文件,其实代码和上节所写代码很相似的,只是稍微加以修改而已。

 

#include <windows.h>

#define CUR 0x1000    //预定义光标的id

//回调函数
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
    
switch(Msg)//处理消息过程,什么是消息,下节再讲
    {
    
case WM_DESTROY://响应鼠标单击关闭按钮事件
        PostQuitMessage(0);//退出消息队列,至于什么是消息队列,下节说
        return 0;//退出函数
    }
    
return DefWindowProc(hWnd,Msg,wParam,lParam);
}

//主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    
char *cName = "myWindow";
    WNDCLASSEX wc;
    HWND hWnd;
    MSG Msg;

    wc.cbClsExtra 
= 0;
    wc.cbWndExtra 
= 0;
    wc.cbSize 
= sizeof(WNDCLASSEX);
    wc.hbrBackground 
= (HBRUSH)GetStockObject(WHITE_BRUSH);//通过函数来设置一个白色的背景,这里大家设置为NULL看看,会很有趣的
    wc.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(CUR));//这里改了,来载入光标资源
    wc.hIcon = NULL;//不设置
    wc.hIconSm = NULL;//不设置
    wc.hInstance = hInstance;//当前程序的句柄,hInstance是有系统给传递的
    wc.lpfnWndProc = WinProc;//窗口处理过程的回调函数。
    wc.lpszClassName =(LPSTR)cName;//窗口类的名字。
    wc.lpszMenuName = NULL;//目录名,不设置
    wc.style = CS_HREDRAW | CS_VREDRAW; 

    RegisterClassEx(
&wc);//在系统中注册

    hWnd 
= CreateWindowEx(WS_EX_CLIENTEDGE,cName,"我的窗口我喜欢",WS_OVERLAPPEDWINDOW,
        
200,100,600,400,NULL,NULL,hInstance,NULL);//创建窗口,窗口标题为"我的窗口我喜欢"
    if(hWnd == NULL)
    {
//容错处理
        MessageBox(NULL,"There's an Error","Error Title",MB_ICONEXCLAMATION|MB_OK);
        
return 0;
    }
    ShowWindow(hWnd,nShowCmd);
//显示窗口
    UpdateWindow(hWnd);

    
//下面是对消息的循环处理,大家先不必管这些,下节课我会细说的
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(
&Msg);//翻译消息
        DispatchMessage(&Msg);//分派消息
    }
    
return Msg.message;
}

 

 

vc编译生成myOwnCursor.obj,myOwnCursor.objmyOwnCursor.res放到同一个文件夹下,然后在命令行下进入它们所在的目录 ,
输入命令:linke kernel32.lib user32.lib gdi32.lib /subsystem:windows myOwnCursor.obj myOwnCursor.res把两个文件连接成myOwnCursor.exe.运行后界面如下;
看到了吧,当鼠标移入窗口的时候,光标就变成了那个手型图案了, 这和魔域的是一样的。到现在想想一个特效又咋地,不还是一句一句代码写出来的,
而特效和普通程序往往只有数据代码不同而已。网络游戏的界面很好看,也只不过是资源文件用的比较多而已,而且计算量很大,所以网游总是很占内存的,
因为图片、声音文件都很大,而且变换比较多、快,就比较占用资源了。
其实再好的程序,只要有了思路,就能写出来,而且写出来也难的,是不是,今天大家应该会有点收获了,都会设计个性的鼠标光标了,比起以前学习C的东西,
应该有一种层次感了吧。这些东西都比较接近系统了,所以学了之后,你对Windows系统也会有很深的了解的。如果各位看官看到本节还有兴趣继续看下去,那么这对
小人就是一种支持,小人在此谢过了;如果看官觉得看这些没有半点收获,那么请看官不要再勉强自己看下去了,免得浪费看官大人的宝贵时间,那是小人所承担不起的。
 
总之了,要想写好程序,就得多练,编译连接过程中很容易发现错误的所在,那么这时你解决一个错误你就提高一次,解决的错误越多越快,你就学的越多越快。
终于后来你会发现,你太难找到错误了,那么恭喜你,你已经升级为大虾了,已经完全脱离了菜菜级了。希望大家继续努力!

 

posted on 2009-12-17 22:17  沧桑不尽  阅读(3750)  评论(27编辑  收藏  举报