首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 完全不用MFC,只用WIN32API ,用C做个按钮,哪位懂,解释下原理,能给代码更好。谢谢了! [已结贴,结贴人:lcin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:27:38 楼主
    最近开始接触WIN下编程,对其消息机制感兴趣,软件无界面那用户就少很多,所以对基本控件实现很感兴趣,经过这些天的学习,知道了消息先由WIN系统分布给对应的窗口,通过句柄识别,然后窗口把他们给其子窗口还是WIN系统直接给应该接受消息的窗口? 迷惑中

    第二个,,,从0开始做按钮,,,这个没什么好的思路,对API也不了解,不知道怎么实现,,,请教大家下。谢谢
    80  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 17:36:001楼 得分:60
    你创建一个Win32的Hello World程序,VC会自动写出创建一个窗口的代码。你在CreateWindow之后,加一行创建按钮控件的代码:
    CreateWindow(_T("BUTTON"), _T("OK"), WS_CHILD ¦WS_VISIBLE, 100, 100, 80, 20, hWnd, NULL, hInstance, NULL);
    这样就可以了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:38:502楼 得分:0
    谢谢这位朋友。不过我不是想用系统的创建,而是想知道按钮如何从0开始创建,我意思是不使用系统提供的,只用API实现
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:45:153楼 得分:0
    消息先由WIN系统分布给对应的窗口,通过句柄识别,然后窗口把他们给其子窗口还是WIN系统直接给应该接受消息的窗口? 迷惑中  2个问题。。期待回答
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:53:414楼 得分:15
    消息时系统根据注册窗口类时的回调函数来分发的
    对于想Button这样的窗口类,产生的消息一般以WM_COMMAND的形式发送到其付窗口中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:55:005楼 得分:0
    引用 2 楼 lcin 的回复:
    谢谢这位朋友。不过我不是想用系统的创建,而是想知道按钮如何从0开始创建,我意思是不使用系统提供的,只用API实现

    不是很明白你的意思
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 17:55:436楼 得分:0
    需要注册一个类,写一个WindowProc响应各种必要的消息,可以参考Hello World,你哪里不会?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 17:57:327楼 得分:0
    我意思就是不用任何的现有的按钮,而自己开发一个按钮,不用MFC,用WIN 32API

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:01:118楼 得分:0
    我意思就是从0开始重新实现车轮,,,自己做一个按钮,,游戏里面按钮不是很有特色吗。。他们如何实现?。。。。

    不想用MFC,,想看看按钮的实现细节,可以说是定制按钮。。不过不利用已有的按钮,,就是从头开始
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:06:069楼 得分:0
    假设系统没有提供按钮这个控件,而自己需要完成这样功能的控件,然后如何开发呢?

    前提是不使用任何已有的按钮相关的函数之类,,思路也可以,我是想通过按钮这个很普遍的控件来猜测其他控件的实现,这样自己对WIN下的GUI方面就会有一定深度的了解了,以后做游戏,做其他相关的也不会迷惑了,谢谢大家啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 18:10:0210楼 得分:0
    引用 6 楼 cnzdgs 的回复:
    需要注册一个类,写一个WindowProc响应各种必要的消息,可以参考Hello World,你哪里不会?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:12:4611楼 得分:0
    用C实现,,我思路这样的。。按钮应该是 WNDCLASSEX的一种吧,,,不知道正确不?

    不过我在样式里没弄到按钮那样的外观。。。一直有标题栏,,,不明白按钮如何实现的。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:16:2312楼 得分:0
    按钮也是窗口的一种,,,去掉标题,然后再消息里处理下,绘制一些特殊效果就好了。。这是我的想法,不过目前都没有去掉标题栏。。 那些点击然后产生的效果在网上找到资料了。。就是没找到如何做一个按钮,,,不用现有空间。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 18:16:5913楼 得分:0
    所有窗口和控件都是Window,都需要RegisterClassEx。
    你创建的时候只给WS_CHILD ¦WS_VISIBLE就不会有标题栏了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:22:1414楼 得分:0
    #include <windows.h>

    TCHAR szTitle[32]="";//"小雅的劝学网";  //窗口的标题
    TCHAR szWindowClass[32]="Simple";  //窗口的名称

    ATOM MyRegisterClass(HINSTANCE);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    int APIENTRY WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR    lpCmdLine,
                        int      nCmdShow)
    {
        MSG msg;

        MyRegisterClass(hInstance);        //注册窗口类

        if (!InitInstance (hInstance, nCmdShow)) //初始化窗口
        {
            return FALSE;
        }

        while (GetMessage(&msg, NULL, 0, 0)) //消息循环
        {
            TranslateMessage(&msg); //消息解释
            DispatchMessage(&msg);  //消息发送
        }

        //注意:不能用“return 0;”,因为有非正常退出的可能性
        return (int)msg.wParam;
    }

    //注册窗口类
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wc;  //定义一个窗口类,其实是一个结构体

        wc.cbSize        = sizeof(WNDCLASSEX);        //结构体的字节长度
        wc.style        = CS_HREDRAW ¦ CS_VREDRAW;  //窗口式样
        wc.lpfnWndProc  = (WNDPROC)WndProc;          //窗口处理函数
        wc.cbClsExtra    = 0;          //分配给窗口类结构之后的额外字节数,一般为0
        wc.cbWndExtra    = 0;          //分配给窗口实例之后的额外字节数,一般为0
        wc.hInstance    = hInstance;  //实例句柄
        wc.hIcon        = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
        wc.hCursor      = LoadCursor(NULL, IDC_ARROW);            //光标
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景
        wc.lpszMenuName  = NULL;            //菜单
        wc.lpszClassName = szWindowClass;  //窗口名
        wc.hIconSm      = LoadIcon(wc.hInstance, (LPCTSTR)IDI_APPLICATION);

        return RegisterClassEx(&wc);
    }

    //初始化窗口
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
      HWND hWnd;

      //创建窗口
      hWnd = CreateWindow( szWindowClass,      //窗口名
                            szTitle,            //窗口标题
                            WS_CHILD &brvbarWS_VISIBLE, //窗口式样
                            100,                //窗口左上角的x坐标
                            100,                //窗口左上角的y坐标
                            50,                //窗口的宽度
                            50,                  //窗口的高度
                            NULL,                //父窗口句柄
                            NULL,                //菜单句柄
                            hInstance,          //实例句柄
                            NULL);              //创建参数
      if (!hWnd)
      {
          return FALSE;
      }
      ShowWindow(hWnd, nCmdShow); //显示窗口
      UpdateWindow(hWnd);        //立即显示

      return TRUE;
    }

    //窗口消息处理
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_DESTROY:                  //关闭窗口
                PostQuitMessage(0);          //发送关闭消息
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);  //缺省窗口处理函数
      }
      return 0;
    }


    不过这样不行啊。。编译出错。。。

    C:\Documents and Settings\sky\桌面\sd\t1.c In function `InitInstance':
    61 C:\Documents and Settings\sky\桌面\sd\t1.c `brvbarWS_VISIBLE' undeclared (first use in this function) 
    (Each undeclared identifier is reported only once
      for each function it appears in.)


    我环境是 XP+ DEV-c++
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:27:1515楼 得分:0
    WS_CHILD &brvbarWS_VISIBLE ?

    这个编译错误,,WS_CHILD &WS_VISIBLE 这个还有标题。。WS_CHILD ¦WS_VISIBLE这个没有显示任何东西
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 18:38:1816楼 得分:0
    要自己写“或”运算符,不要从网页复制。
    你需要先创建一个窗口,然后在窗口上面创建自己的按钮,不能程序上来直接就创建控件。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:45:1617楼 得分:0
    哦。请问下如何在窗口上面创建按钮啊。就是坐标等等信息,还有他是不是为窗口的子窗口?


    是不是在窗口上面绘制还是?。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:50:0018楼 得分:0
    我这样想的,就是控件初始化时,先在父窗口上获取一个区域,然后对这个区域进行绘制,产生他自己的外观,

    是这样的吗?

    消息方面是捕获鼠标移动信息,对比按钮的坐标,然后作出一些反应,实际的实现是不是这样的?

    谢谢了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 19:13:2519楼 得分:0
    按钮本身就是一个窗口,你创建一个窗口的时候,指定父窗口,会在你指定的位置出现窗口
    至于窗口怎么画,就要看你的窗口函数了
    不是指定一个区域
    等等这样的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 19:23:5820楼 得分:0
    “按钮本身就是一个窗口,你创建一个窗口的时候,指定父窗口,会在你指定的位置出现窗口
    至于窗口怎么画,就要看你的窗口函数了 ”

    你说的这个“就要看你的窗口函数了”是那个父窗口吗?  谢谢了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-18 21:05:2121楼 得分:0
    差不多是你理解的样子,不知道的地方试几次就明白了。按钮的窗口函数要响应WM_PAINT消息来绘制自己。另外就是要响应键盘和鼠标的相关消息。其它还有一些消息要响应,不过不是很重要。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 21:19:5622楼 得分:5
    回到DOS, 在显存环境下开发一套窗口系统,体验一下。呵呵

    MFC我也刚涉足,同感兴趣。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 22:29:2223楼 得分:0
    不太懂啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • r_swordsman
    • 等级:
    发表于:2008-05-19 08:23:0124楼 得分:0
    引用 17 楼 lcin 的回复:
    哦。请问下如何在窗口上面创建按钮啊。就是坐标等等信息,还有他是不是为窗口的子窗口?


    是不是在窗口上面绘制还是?。。。


    按钮是WINDOWS的基本控件,完全可以使用WIN32 API来创建。

    如果你是使用DRIECTX来创建游戏中的按钮的话,那就要自己绘制了。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved