开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1507|回复: 8
收起左侧

[图文教程] win32api窗口程序开发第仨天--hello world续集3

[复制链接]
结帖率:0% (0/2)
发表于 2020-1-16 08:47:06 | 显示全部楼层 |阅读模式   山东省烟台市
本帖最后由 jingyixiaocai 于 2020-1-16 10:15 编辑

先上图片留作纪念

点击按钮1编辑框内容为Hello world按钮退出自然就是退出程序

直接上我写的,有不足之处希望大家多多指点啊:

#include<windows.h>
#include <winuser.h>
#define  IDC_Edit  1234
        //声明回调函数 typedef LONG_PTR LRESULT;#define CALLBACK __stdcall
        //LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
   LONG_PTR __stdcall WndProc (HWND, UINT, WPARAM, LPARAM) ;  //也行,不是麻烦吗?还是用上面的 主要是解析

//主函数 程序入口
int WINAPI WinMain (HINSTANCE hInstance,//应用程序的实例句柄
                                         HINSTANCE hPrevInstance,
                    PSTR szCmdLine,    //命令行
                                        int iCmdShow)     //显示方式
{
        
    static TCHAR szAppName[] = TEXT ("HelloWin") ;


    HWND         hwnd ;        //用来保存成功创建窗口后返回的句柄
    MSG          msg ;         //定义消息结构体变量
    WNDCLASS     mywnd ;    //窗体类

    mywnd.style         = CS_HREDRAW | CS_VREDRAW ; //指定窗口风格 位置改变时重绘
    mywnd.lpfnWndProc   = WndProc ; ////函数指针,指向处理窗口消息的函数入口
    mywnd.cbClsExtra    = 0 ;       //结构体后附加的字节数,一般总为0
    mywnd.cbWndExtra    = 0 ;       //窗体实例附加的字节数,一般总为0
    mywnd.hInstance     = hInstance ;                          //模块句柄
    mywnd.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;   //图标句柄 任务栏显示的图标
    mywnd.hCursor       = LoadCursor (NULL, IDC_ARROW) ;       //光标句柄
    mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色COLOR_BACKGROUND
    mywnd.lpszMenuName  = NULL ;      //菜单名的字符串
    mywnd.lpszClassName = szAppName ; //自定义类名,不要与其他类名重复



                 /******************************
                 1完成 上面属于填表我自己起的名字
           填完表格当然是注册啦 注册成功开是营业
                                        ********************* ************/
                                       
                                                
    if (!RegisterClass (&mywnd))
    {
        MessageBox (NULL, TEXT ("注册类失败!"), szAppName, MB_ICONERROR) ;
        return 0 ;
    }

                  /******************************
               注册成功开是营业 在window上创建窗口和组件
                                        ********************* ************/
    int x =GetSystemMetrics(SM_CXSCREEN)-300; //x屏幕宽度-程序宽度=程序在右边显示
    int y =GetSystemMetrics(SM_CYSCREEN); //y屏幕高度  我直接写0表示运行后在右上角显示

    //创建窗体API
    hwnd = CreateWindow(szAppName,TEXT("我的第一个C"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,0,300,400,NULL,NULL,hInstance,NULL);
    //这个API11个参数,以后创建按钮我会解析的
    //显示窗体的API 传入需要显示的窗体句柄和显示方式
    ShowWindow(hwnd,iCmdShow);
    //刷新窗体的API
    UpdateWindow(hwnd);

    //从系统的应用程序线程消息队列中取得一个消息
    while(GetMessage(&msg,NULL,0,0) > 0)
    {
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
                   /******************************
               下面的东西熟悉么??知道回调函数是神马意思了吧
                                        ********************* ************/



LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC             hdc;             //句柄
    PAINTSTRUCT     ps;
    RECT            rect;            //矩形
    HINSTANCE       hInstance;       //窗口实例
    static HWND     hwndButton[4],hwndEdit;   //句柄
                       
        //窗口创建也的能退出

        switch(message)
    {
     case WM_CLOSE: //关闭
         if(IDYES==MessageBox(hwnd,"是否关闭程序?","提示",MB_YESNO|MB_ICONQUESTION))
         {
             DestroyWindow (hwnd);   
         }
         return 0;
     case WM_DESTROY: //退出程序
         PostQuitMessage (0) ;
         return 0 ;
     case WM_CREATE: //创建按钮
         {
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
            //按钮1
            hwndButton[0] = CreateWindow("BUTTON",
                                                                             "按钮1",   //按钮标题   
                                         WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,                                 
                                                                10,        //  int X8按钮在窗口的左边  Y9 定边  int nWidth100  宽度    int nHeight50  高度                                    
                                                                                9,
                                                                                100,
                                                                                50,
                                                                                hwnd,     //窗口句柄 指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。
                                                                                NULL,     //菜单句柄,或依据窗口风格指明一个子窗口标识。
                                                       (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),//获取应用实例句柄 HANDLE hlnstance,
                                                                            NULL);//指向一个值的指针,该值传递给窗口WM_CREATE消息 11个参数解析完毕
            //练习按钮创建
hwndButton[1] = CreateWindow("BUTTON","按钮退出", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  10,60,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
// hwndButton[2] = CreateWindow("BUTTON","按钮3", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  10,110,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
// hwndButton[3] = CreateWindow("BUTTON","按钮4", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  10,170,100,50,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
//这函数很实用啊  1234我开始就声明了
      hwndEdit = CreateWindow("Edit", "编辑框", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,    10, 230, 200, 80, hwnd,(HMENU)1234, NULL, NULL);                 
            return 0;
       case WM_COMMAND: //响应按钮消息 完成我们Hello world
         if((HWND)lParam == hwndButton[0])
         {
             SetDlgItemTextA(hwnd, IDC_Edit, "Hello world");               
         }
         if((HWND)lParam == hwndButton[1])
         {
            DestroyWindow (hwnd);
         }
         return 0;
         }   
            default:
                    break;
    }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}





mywind.rar

181.54 KB, 下载次数: 3, 下载积分: 精币 -2 枚

发表于 2022-5-6 19:23:16 | 显示全部楼层   广东省珠海市
支持。辛苦你了
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-16 10:08:13 | 显示全部楼层   山东省烟台市
项目部006 发表于 2020-1-16 10:05
CreateWindow 字符串又没有使用 TEXT("")....
建议工程字符集使用Unicode, 现在Unicode是主流, Windows核 ...

忘了感谢纠正
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2020-1-16 10:05:31 | 显示全部楼层   广东省揭阳市
CreateWindow 字符串又没有使用 TEXT("")....
建议工程字符集使用Unicode, 现在Unicode是主流, Windows核心就是Unicode驱动的, 内核字符串都统一使用Unicode的
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-16 09:50:46 | 显示全部楼层   山东省烟台市
福仔 发表于 2020-1-16 09:39
LRESULT 的定义就是 LONG_PTR, 所以两个类型可以互相赋值
CALLBACK宏的内容就是 __stdcall, 所以你用哪个 ...

对头,我转换一个编辑框的,完全通过
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
 楼主| 发表于 2020-1-16 09:49:19 | 显示全部楼层   山东省烟台市
福仔 发表于 2020-1-16 09:42
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Wind ...

让按钮好看点??厉害啊
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 12 天

发表于 2020-1-16 09:42:49 | 显示全部楼层   广东省揭阳市
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144*F1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144*F1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144*F1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144*F1df' language='*'\"")
#endif


找个地方加上这一段代码可以把组件改变成 通用组件库6.0的风格

点评

用不了, 有些东西触发了关键字被替换了.....   广东省揭阳市  发表于 2020-1-16 09:43
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 12 天

发表于 2020-1-16 09:39:55 | 显示全部楼层   广东省揭阳市
LRESULT 的定义就是 LONG_PTR, 所以两个类型可以互相赋值
CALLBACK宏的内容就是 __stdcall, 所以你用哪个都可以, 用宏主要是为了看起来更明确的知道WndProc 这是一个回调

还有创建组件, 最好是把ID写上, ID写上就是固定的, 不会变的, 窗口句柄是每次基本都不一样, ID可以作为这个控件的唯一标志
(HMENU)id 强转传递进去就可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表