How to create a Windows-style textbox in a C++ Win32 application

后端 未结 3 1379
离开以前
离开以前 2020-12-06 18:06

I tried this:

#include 

#pragma comment(linker,\"/manifestdependency:\\\"type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=         


        
相关标签:
3条回答
  • 2020-12-06 18:31

    The OP edited his question, removing the original code and therefore invalidating the answers, saying:

    This is a simple example to create a window with a textbox.

    I rolled it back to restore the original code, but I thought the working example was nice, so here it is:

    #include <windows.h>
    
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         LPSTR nCmdLine, int nCmdShow)
    {
      LPTSTR windowClass = TEXT("WinApp");
      LPTSTR windowTitle = TEXT("Windows Application");
      WNDCLASSEX wcex;
    
      wcex.cbClsExtra = 0;
      wcex.cbSize = sizeof(WNDCLASSEX);
      wcex.cbWndExtra = 0;
      wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
      wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
      wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
      wcex.hInstance = hInstance;
      wcex.lpfnWndProc = WndProc;
      wcex.lpszClassName = windowClass;
      wcex.lpszMenuName = NULL;
      wcex.style = CS_HREDRAW | CS_VREDRAW;
      if (!RegisterClassEx(&wcex))
      {
        MessageBox(NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"),
                   MB_ICONERROR);
        return EXIT_FAILURE;
      }
    
      HWND hWnd;
    
      if (!(hWnd = CreateWindow(windowClass, windowTitle, WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                                CW_USEDEFAULT, NULL, NULL, hInstance, NULL)))
      {
        MessageBox(NULL, TEXT("CreateWindow Failed!"), TEXT("Error"), MB_ICONERROR);
        return EXIT_FAILURE;
      }
    
      HWND hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Edit"), TEXT("test"),
                                   WS_CHILD | WS_VISIBLE, 100, 20, 140,
                                   20, hWnd, NULL, NULL, NULL);
    
      ShowWindow(hWnd, nCmdShow);
      UpdateWindow(hWnd);
    
      MSG msg;
    
      while (GetMessage(&msg, NULL, 0, 0))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return EXIT_SUCCESS;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
      switch (msg)
      {
      case WM_DESTROY:
        PostQuitMessage(EXIT_SUCCESS);
      default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
      }
      return FALSE;
    }
    
    0 讨论(0)
  • 2020-12-06 18:47

    In Codeblocks put manifest file near project: program_name.exe.manifest

    screenshot

    And to program_name.exe.manifest write this:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
    />
    <description>Program name</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    

    And then your program look like this:

    Screenshot

    0 讨论(0)
  • 2020-12-06 18:49

    Instead of using CreateWindow, use CreateWindowEx and specify WS_EX_CLIENTEDGE as the first parameter.

    You can compare the styles of your created edit control with a stock one (for example, when you show 'Properties' on a file in the explorer) with the Spy++ tool that comes along Visual Studio.

    0 讨论(0)
提交回复
热议问题