【问题标题】:Thanks a lot! I'm nearly done with my proj非常感谢!我的项目快完成了
【发布时间】:2021-09-03 18:30:31
【问题描述】:

我有一个 c 程序,我应该给它添加接口。我可以使用 WIn32 将我的代码插入到我的编码接口中吗?

示例:这是我将二进制转换为八进制的代码。

 void biTodec(){


 long long n;
 int dec = 0, i = 0, rem;
 printf("Enter a binary number: ");
 scanf("%lld", &n);
 while (n != 0) {
    rem = n % 10;
    n /= 10;
    dec += rem * pow(2, i);
    ++i;
 }
 printf("%lld in binary = %d in decimal", n, dec);
  return 0;
 }

现在,我希望我的 API 中的按钮在单击时执行转换。这是我的 Win32 设计

  #include <stdio.h>
 #include <conio.h>
 #include <windows.h>
 #include <stdlib.h>

 LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM,LPARAM);

 void AddMenus(HWND);
 void AddControls(HWND);

 HMENU hMenu;



  int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hPrevInst, LPSTR 
 args, int 
  ncmdshow){



  WNDCLASSW kim = {0};
  kim.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
  kim.hCursor = LoadCursor(NULL, IDC_ARROW);
  kim.hInstance = hinst;
  kim.lpszClassName = L"myWindowClass";
  kim.lpfnWndProc = WindowProcedure;

  if(!RegisterClassW(&kim))
    return -1;

  CreateWindowW(L"myWindowClass",L"Number System Converter", 
 WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, 
 NULL,NULL,NULL,NULL);
 MSG msg={0};
 while(GetMessage(&msg, NULL,NULL, NULL)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);

  }
  return 0;
   }


 LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM 
 wp,LPARAM lp){

  switch(msg){

 case WM_COMMAND:


    switch(wp){
    case 1:
        MessageBoxA(hWnd, "This project was made by bla bla for 
    seven (7) days. He had no any prior idea on interface so he spent 
  the 6 out of 7 days just for researching. Copyright 2021", "About 
  the 
  project", NULL);

        break;
    case 2:
        MessageBeep(MB_OK);
        break;
    case 3:
        PostQuitMessage(0);
        break;
    case 4:
        MessageBeep(MB_OK);
        break;
    case 5:
        MessageBeep(MB_OK);
        break;
    }
  case WM_CREATE:
    AddMenus(hWnd);
    AddControls(hWnd);
    break;

  case WM_DESTROY:
    PostQuitMessage(0);
    break;

  default:
    return DefWindowProcW(hWnd,msg,wp,lp);

  }
  }
  void AddMenus(HWND hWnd){
  hMenu = CreateMenu();
   HMENU hFileMenu = CreateMenu();
   HMENU hSubMenu = CreatePopupMenu();

   AppendMenu(hSubMenu,MF_STRING, 4, "File");
   AppendMenu(hSubMenu,MF_STRING, 5, "Folder");
   AppendMenu(hSubMenu, MF_SEPARATOR, NULL, NULL);

   AppendMenu(hFileMenu,MF_POPUP,(UINT_PTR)hSubMenu, "Open");
   AppendMenu(hFileMenu,MF_STRING, 2, "Save");
   AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);
   AppendMenu(hFileMenu,MF_STRING, 3, "Exit");

   AppendMenu(hMenu, MF_POPUP ,(UINT_PTR)hFileMenu, "Options");
  AppendMenu(hMenu, MF_POPUP ,1, "Help");


   SetMenu(hWnd, hMenu);
  }

  void AddControls(HWND hWnd){
CreateWindowW(L"Static",L"Choose the number system to be converted", 
  WS_VISIBLE|WS_CHILD,100, 30, 300, 20, hWnd, NULL, NULL, NULL );

  CreateWindowW(L"Edit", L"", WS_VISIBLE|WS_BORDER| WS_CHILD, 60, 80, 
 120, 30, hWnd, NULL, NULL,NULL);
CreateWindowW(L"Button", L"Generate", WS_VISIBLE|WS_BORDER|WS_CHILD, 
200, 80, 80, 20, hWnd, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"", WS_VISIBLE|WS_BORDER| WS_CHILD, 300, 80, 
120, 30, hWnd, NULL, NULL,NULL);

CreateWindowW(L"Button", L"Binary", 
  WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 60, 150, 
  120, 20, hWnd,NULL , NULL, NULL);
CreateWindowW(L"Button", L"Decimal", 
 WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 60, 180, 
 120, 20, hWnd,NULL , NULL, NULL);
CreateWindowW(L"Button", L"Octal", 
 WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 60, 210, 
 120, 20, hWnd, NULL, NULL, NULL);
CreateWindowW(L"Button", L"Hexadecimal", 
  WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP,60, 240, 
 120, 20, hWnd, NULL, NULL, NULL);

   CreateWindowW(L"Button", L"Binary", 
  WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 300, 150, 
  120, 20, hWnd,NULL , NULL, NULL);
CreateWindowW(L"Button", L"Decimal", 
  WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 300, 180, 
  120, 20, hWnd,NULL , NULL, NULL);
  CreateWindowW(L"Button", L"Octal", 
   WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON|WS_TABSTOP, 300, 210, 
 120, 20, hWnd, NULL, NULL, NULL);
  CreateWindowW(L"Button", L"Hexadecimal", 
   WS_VISIBLE|WS_BORDER|WS_CHILD|BS_RADIOBUTTON | WS_TABSTOP, 300, 
  240, 120, 20, hWnd,NULL, NULL, NULL);

  }

是否可以将我的代码插入 API?如果没有,你能建议我在我的程序中创建用户界面需要学习什么吗?

【问题讨论】:

  • 为什么不使用 MSVC 对话框编辑器来代替复杂的代码?
  • @pau 因为,你知道,对话框编辑器已经被破坏了近十年。不依赖经常被破坏的技术是完全合理的。
  • 您是否尝试编译您的代码?它包含错误和警告。请先解决这个问题。
  • 这与您的previous question 基本相同,最终归结为:如何编写 Windows 应用程序同时避免学习如何编写 Windows 应用程序?这不会有用。
  • 也许您应该首先专注于编写一个可以工作的基本 Windows GUI 程序。如果您对此有困难;然后问具体问题。您可以从问题中显示的代码开始。第一步,忘记你的转换例程,专注于消除所有编译错误和警告。

标签: c windows user-interface winapi visual-studio-code


【解决方案1】:

我已经修复了您的代码并插入了您的转换功能。我没有添加更多的转换 - 你会用我的例子自己做 - 我也没有添加增强功能。

要修复 Windows API 部分,请注意我有:

保存所有 HWND 以便控件能够获取/设置值。

使用 BS_AUTORADIOBUTTON 和 WS_GROUP 使单选按钮正常工作。

所有控件都使用了标识符,以便能够检查请求的操作。

使用适当的强制转换修复了各种警告。

#include <stdio.h>
#include <wchar.h>
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <math.h>

#define ID_CONV_SRC_BINARY       0x100
#define ID_CONV_SRC_OCTAL        0x101
#define ID_CONV_SRC_DECIMAL      0x102
#define ID_CONV_SRC_HEXADECIMAL  0x103
#define ID_CONV_DST_BINARY       0x200
#define ID_CONV_DST_OCTAL        0x201
#define ID_CONV_DST_DECIMAL      0x202
#define ID_CONV_DST_HEXADECIMAL  0x203
#define ID_GENERATE              0x300

int srcConvert = 0;
int dstConvert = 0;

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

void AddMenus(HWND);
void AddControls(HWND);

HMENU hMenu;
HWND hNum, hOut;
HWND hWndInEdit;
HWND hWndOutEdit;
HWND hWndSrcBinary;
HWND hWndSrcOctal;
HWND hWndSrcDecimal;
HWND hWndSrcHexadecimal;
HWND hWndDstBinary;
HWND hWndDstOctal;
HWND hWndDstDecimal;
HWND hWndDstHexadecimal;

void biTodec(
    wchar_t * const inBuf,
    wchar_t * const outBuf,
    size_t outBufSize)
{
    long long n;
    int dec = 0, i = 0, rem;
    if (swscanf(inBuf, L"%lld", &n) == 1) {
        while (n != 0) {
            rem = n % 10;
            n /= 10;
            dec += rem * (1 << i);//pow(2, i);
            ++i;
        }
    }
    swprintf(outBuf, outBufSize, L"%d", dec);
}

int WINAPI WinMain(
    _In_ HINSTANCE hinst,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd) 
{
    WNDCLASSW kim = { 0 };
    kim.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    kim.hCursor = LoadCursor(NULL, IDC_ARROW);
    kim.hInstance = hinst;
    kim.lpszClassName = L"myWindowClass";
    kim.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&kim))
        return -1;

    HWND hWnd = CreateWindowW(L"myWindowClass", L"Number System Converter", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100, 500, 500, NULL, NULL, NULL, NULL);
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

void Generate(HWND hWnd)
{
    wchar_t inBuf[30];
    wchar_t outBuf[30];

    if (Button_GetCheck(hWndSrcBinary))
        srcConvert = ID_CONV_SRC_BINARY;
    else if (Button_GetCheck(hWndSrcDecimal))
        srcConvert = ID_CONV_SRC_DECIMAL;
    else if (Button_GetCheck(hWndSrcOctal))
        srcConvert = ID_CONV_SRC_OCTAL;
    else if (Button_GetCheck(hWndSrcHexadecimal))
        srcConvert = ID_CONV_SRC_HEXADECIMAL;
    else
        srcConvert = 0;

    if (Button_GetCheck(hWndDstBinary))
        dstConvert = ID_CONV_DST_BINARY;
    else if (Button_GetCheck(hWndDstDecimal))
        dstConvert = ID_CONV_DST_DECIMAL;
    else if (Button_GetCheck(hWndDstOctal))
        dstConvert = ID_CONV_DST_OCTAL;
    else if (Button_GetCheck(hWndDstHexadecimal))
        dstConvert = ID_CONV_DST_HEXADECIMAL;
    else
        dstConvert = 0;

    GetWindowText(hWndInEdit, inBuf, sizeof(inBuf) / sizeof(inBuf[0]));
    if ((srcConvert & 0xFF) == (dstConvert & 0xFF))
        wcscpy(outBuf, inBuf);
    else if ((srcConvert == ID_CONV_SRC_BINARY) && (dstConvert == ID_CONV_DST_DECIMAL))
        biTodec(inBuf, outBuf, sizeof(outBuf));
    else {
        MessageBox(hWnd, L"Not implemented yet", L"Warning", MB_OK);
        outBuf[0] = 0;
    }
    SetWindowText(hWndOutEdit, outBuf);
}


LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 
{
    switch (msg) {
    case WM_COMMAND:
        switch (wp) {
        case ID_CONV_SRC_BINARY:
        case ID_CONV_SRC_DECIMAL:
        case ID_CONV_SRC_HEXADECIMAL:
        case ID_CONV_SRC_OCTAL:
        case ID_CONV_DST_BINARY:
        case ID_CONV_DST_DECIMAL:
        case ID_CONV_DST_HEXADECIMAL:
        case ID_CONV_DST_OCTAL:
        case ID_GENERATE:
            Generate(hWnd);
            break;
        case 1:
            MessageBox(hWnd, L"Copyright 2021", L"About the project", MB_OK);
            break;
        case 2:
            MessageBeep(MB_OK);
            break;
        case 3:
            PostQuitMessage(0);
            break;
        case 4:
            MessageBeep(MB_OK);
            break;
        case 5:
            MessageBeep(MB_OK);
            break;
        }
        break;
    case WM_CREATE:
        AddMenus(hWnd);
        AddControls(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }
    return 0;
}

void AddMenus(HWND hWnd) {
    hMenu = CreateMenu();
    HMENU hFileMenu = CreateMenu();
    HMENU hSubMenu = CreatePopupMenu();

    AppendMenu(hSubMenu, MF_STRING, 4, L"File");
    AppendMenu(hSubMenu, MF_STRING, 5, L"Folder");
    AppendMenu(hSubMenu, MF_SEPARATOR, 0, NULL);

    AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Open");
    AppendMenu(hFileMenu, MF_STRING, 2, L"Save");
    AppendMenu(hFileMenu, MF_SEPARATOR, 0, NULL);
    AppendMenu(hFileMenu, MF_STRING, 3, L"Exit");

    AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"Options");
    AppendMenu(hMenu, MF_POPUP, 1, L"Help");

    SetMenu(hWnd, hMenu);
}

void AddControls(HWND hWnd) {
    CreateWindowW(L"Static", L"Choose the number system to be converted",
        WS_VISIBLE | WS_CHILD, 100,
        30, 300, 20, hWnd, NULL, NULL, NULL);

    hWndInEdit = CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_BORDER | WS_CHILD, 60, 80, 120, 30, hWnd, NULL,
        NULL, NULL);
    CreateWindowW(L"Button", L"Generate", WS_VISIBLE | WS_BORDER | WS_CHILD, 200, 80, 80, 20, hWnd,
        (HMENU)ID_GENERATE,
        0, NULL);
    hWndOutEdit = CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_BORDER | WS_CHILD, 300, 80, 120, 30, hWnd, NULL,
        NULL, NULL);

    hWndSrcBinary = CreateWindowW(L"Button", L"Binary", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,
        60, 150, 120, 20, hWnd, (HMENU)ID_CONV_SRC_BINARY, NULL, NULL);
    hWndSrcDecimal = CreateWindowW(L"Button", L"Decimal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON, 
        60, 180, 120, 20, hWnd, (HMENU)ID_CONV_SRC_DECIMAL, NULL, NULL);
    hWndSrcOctal = CreateWindowW(L"Button", L"Octal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON,  
        60, 210, 120, 20, hWnd, (HMENU)ID_CONV_SRC_OCTAL, NULL, NULL);
    hWndSrcHexadecimal = CreateWindowW(L"Button", L"Hexadecimal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON, 
        60, 240, 120, 20, hWnd, (HMENU)ID_CONV_SRC_HEXADECIMAL, NULL, NULL);

    hWndDstBinary = CreateWindowW(L"Button", L"Binary", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,
        300, 150, 120, 20, hWnd, (HMENU)ID_CONV_DST_BINARY, NULL, NULL);
    hWndDstDecimal = CreateWindowW(L"Button", L"Decimal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON, ,
        300, 180, 120, 20, hWnd, (HMENU)ID_CONV_DST_DECIMAL, NULL, NULL);
    hWndDstOctal = CreateWindowW(L"Button", L"Octal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON, 
        300, 210, 120, 20, hWnd, (HMENU)ID_CONV_DST_OCTAL, NULL, NULL);
    hWndDstHexadecimal = CreateWindowW(L"Button", L"Hexadecimal", WS_VISIBLE | WS_BORDER | WS_CHILD | BS_AUTORADIOBUTTON, 
        300, 240, 120, 20, hWnd, (HMENU)ID_CONV_DST_HEXADECIMAL, NULL, NULL);

}

还有很大的改进空间。我做了最低限度的回答你的问题。如果您需要更多帮助,请提出更多问题。

【讨论】:

  • 非常感谢@fpiette...我无法表达我的感激之情。非常感谢
  • 完美。现在像我一样删除多余的 cmets。一旦你阅读它,我将删除它。谢谢。
  • 嗨 @fpiette 先生,无论我输入什么二进制数,转换为十进制都是零。先生,我应该解决什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2023-02-06
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多