• Win32API C语言 InputBox输入框实现


      1 #define ID_INPUTEDIT 1001
      2 #define ID_OK 1002
      3 
      4 BOOL closing = FALSE;
      5 HWND dialogHandle = 0;
      6 
      7 LRESULT CALLBACK inputBoxWndProc(HWND wndHandle, UINT message, WPARAM wParam, LPARAM lParam)
      8 {    
      9     static char **result = 0;
     10     static HWND inputHandle = 0;    
     11     
     12     switch (message)
     13     {
     14     case WM_NCCREATE:
     15         result = ((CREATESTRUCT *)lParam)->lpCreateParams;        
     16         break;
     17     
     18     case WM_CLOSE:
     19     case WM_DESTROY:
     20         closing = TRUE;
     21         dialogHandle = 0;
     22         PostQuitMessage(0);
     23         break;
     24     
     25     case WM_COMMAND:    
     26         int notifyCode = HIWORD(wParam);    
     27         int controlId = LOWORD(wParam);    
     28         HWND controlHandle = (HWND)lParam;
     29         
     30         switch (controlId)
     31         {
     32         case ID_INPUTEDIT:
     33             inputHandle = controlHandle;
     34             
     35             if (notifyCode == EN_UPDATE)
     36             {
     37                 if (*result == 0)
     38                     *result = malloc(256);
     39                 GetWindowText(inputHandle, *result, 256);
     40                 PostQuitMessage(0);
     41             }
     42             break;
     43             
     44         case ID_OK:
     45             SendMessage(wndHandle, WM_CLOSE, 0, 0);
     46             break;
     47         }
     48         break;
     49     }
     50     
     51     return DefWindowProc(wndHandle, message, wParam, lParam);
     52 }
     53 
     54 WNDCLASS wndClass; // 全局变量自动清0
     55 
     56 void inputbox_init(void)
     57 {
     58     wndClass.hCursor = LoadCursor(0, IDC_ARROW);
     59 //    WndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
     60 //    wndClass.cbSize = sizeof wndClass;
     61     wndClass.style = CS_HREDRAW | CS_VREDRAW;
     62     wndClass.lpfnWndProc = inputBoxWndProc;
     63     wndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
     64     wndClass.lpszClassName = "InputBox";
     65     wndClass.hInstance = GetModuleHandle(0);
     66 
     67     RegisterClass(&wndClass);
     68 }
     69 
     70 HWND dialog_init(char *hint, char **result)
     71 {
     72 #define X 5
     73 #define OKBUTTON_WIDTH 75
     74 #define INPUTEDIT_WIDTH (width0 - OKBUTTON_WIDTH)
     75 #define INPUTEDIT_Y 29
     76 #define HINT_HEIGHT 24
     77 #define CHAR_WIDTH 8
     78     HWND dialogHandle, inputLabelHandle, inputHandle, okButtonHandle;
     79     
     80     int hint_width = strlen(hint) * CHAR_WIDTH,
     81         width0 = hint_width + OKBUTTON_WIDTH,
     82         height = HINT_HEIGHT + INPUTEDIT_Y + 50;
     83     
     84     dialogHandle = CreateWindow(
     85         wndClass.lpszClassName, "文本输入框的标题", WS_OVERLAPPEDWINDOW,
     86         100, 100, width0 + 50, height,
     87         0, 0, wndClass.hInstance, result);
     88 
     89     inputLabelHandle = CreateWindow(
     90         "STATIC", hint, WS_CHILD | WS_VISIBLE,
     91         X, 5, hint_width, HINT_HEIGHT,
     92         dialogHandle, 0, wndClass.hInstance, 0);
     93 
     94     inputHandle = CreateWindow(
     95         "EDIT", "", WS_BORDER | WS_CHILD | WS_VISIBLE,
     96         X, INPUTEDIT_Y, INPUTEDIT_WIDTH, 24,
     97         dialogHandle, (HMENU)ID_INPUTEDIT, wndClass.hInstance, 0);
     98 
     99     okButtonHandle = CreateWindow(
    100         "BUTTON", "确定按钮", WS_CHILD | WS_VISIBLE,
    101         X + INPUTEDIT_WIDTH + 5, INPUTEDIT_Y, OKBUTTON_WIDTH, 24,
    102         dialogHandle, (HMENU)ID_OK, wndClass.hInstance, 0);
    103     
    104     return dialogHandle;
    105 }
    106 
    107 char *inputbox(char *hint)
    108 {
    109     static char *result = 0;
    110     MSG msg;
    111     
    112     if (dialogHandle == 0)
    113     {
    114         dialogHandle = dialog_init(hint, &result);
    115         
    116         if (dialogHandle == 0)
    117             return 0;
    118     }
    119  
    120     // 在桌面显示窗口
    121     ShowWindow(dialogHandle, SW_SHOWNORMAL);
    122  
    123     // 刷新窗口客户区
    124     // UpdateWindow(dialogHandle);
    125  
    126     while (GetMessage(&msg, 0, 0, 0))
    127     {
    128         TranslateMessage(&msg);
    129         DispatchMessage(&msg);
    130     }
    131  
    132     return result;
    133 }
  • 相关阅读:
    spy++工具
    select 设置发送超时发送注意事项
    C++ Socket超时设置
    linux下的find文件查找命令与grep文件内容查找命令
    C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
    vc6.0出现“cannot add new member”解决办法
    Nginx虚拟主机配置(20200202)
    Centos7内核版安装nginx环境问题及解决方法
    Nginx架构分析(20200202)
    软链接和硬链接——Linux中的文件共享
  • 原文地址:https://www.cnblogs.com/ageane/p/inputbox2.html
Copyright © 2020-2023  润新知