2017-07-03 54 views
1

正在我的Windows 8.1机器上使用codeblocks ide在cpp中做一个小项目。添加菜单是好的,甚至我添加了一些常见的控件,如按钮,静态,编辑根据我的一些笔记从在线来源。如何在winapi C++上创建一些基本的控件,如列表框一样的基本控件

的main.cpp

#include <stdio.h> 
#include <string.h> 
#include <windows.h> 
#include <winuser.h> 

#define BTN_BUTTON 201 
#define CMB_COMBOBOX 202 
#define LST_LISTBOX 203 
#define TXT_TEXTBOX 204 
/* Declare Windows procedure */ 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 

/* Make the class name into a global variable */ 
char szClassName[ ] = "CodeBlocksWindowsApp"; 

int WINAPI WinMain (HINSTANCE hThisInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpszArgument, 
        int nCmdShow) 
{ 
    HWND hwnd;    /* This is the handle for our window */ 
    MSG messages;   /* Here messages to the application are saved */ 
    WNDCLASSEX wincl;  /* Data structure for the windowclass */ 

    /* The Window structure */ 
    wincl.hInstance = hThisInstance; 
    wincl.lpszClassName = szClassName; 
    wincl.lpfnWndProc = WindowProcedure;  /* This function is called by windows */ 
    wincl.style = CS_DBLCLKS;     /* Catch double-clicks */ 
    wincl.cbSize = sizeof (WNDCLASSEX); 

    /* Use default icon and mouse-pointer */ 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); 
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wincl.lpszMenuName = NULL;     /* No menu */ 
    wincl.cbClsExtra = 0;      /* No extra bytes after the window class */ 
    wincl.cbWndExtra = 0;      /* structure or the window instance */ 
    /* Use Windows's default colour as the background of the window */ 
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 

    /* Register the window class, and if it fails quit the program */ 
    if (!RegisterClassEx (&wincl)) 
     return 0; 

    /* The class is registered, let's create the program*/ 
    hwnd = CreateWindowEx (
      0,     /* Extended possibilites for variation */ 
      szClassName,   /* Classname */ 
      "Code::Blocks Template Windows App",  /* Title Text */ 
      WS_OVERLAPPEDWINDOW, /* default window */ 
      CW_USEDEFAULT,  /* Windows decides the position */ 
      CW_USEDEFAULT,  /* where the window ends up on the screen */ 
      544,     /* The programs width */ 
      375,     /* and height in pixels */ 
      HWND_DESKTOP,  /* The window is a child-window to desktop */ 
      NULL,    /* No menu */ 
      hThisInstance,  /* Program Instance handler */ 
      NULL     /* No Window Creation data */ 
      ); 

    /* Make the window visible on the screen */ 
    ShowWindow (hwnd, nCmdShow); 

    /* Run the message loop. It will run until GetMessage() returns 0 */ 
    while (GetMessage (&messages, NULL, 0, 0)) 
    { 
     /* Translate virtual-key messages into character messages */ 
     TranslateMessage(&messages); 
     /* Send message to WindowProcedure */ 
     DispatchMessage(&messages); 
    } 

    /* The program return-value is 0 - The value that PostQuitMessage() gave */ 
    return messages.wParam; 
} 


/* This function is called by the Windows function DispatchMessage() */ 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message)     /* handle the messages */ 
    { 
     case WM_CREATE: 
      CreateWindow ("combobox", NULL, 
       WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 
       20, 10, 400, 120, 
       hwnd, (HMENU)CMB_COMBOBOX, GetModuleHandle(NULL), NULL); 
    // If you uncomment the function below that I used to create a listbox see my program does not compile   
/* 
       CreateWindow ("listbox", NULL, 
        WS_CHILD | WS_VISIBLE | LBS_NOTIFY | LBS_COMBOBOX, 
        20, 40, 140, 120, 
        hwnd, (HMENU)LST_LISTBOX, GetModuleHandle(NULL), NULL); 
       */ 
      CreateWindow("edit", NULL, 
       WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL| ES_MULTILINE | ES_AUTOHSCROLL, 
       170, 40, 250, 120, 
       hwnd, (HMENU)TXT_TEXTBOX, GetModuleHandle(NULL), NULL); 

      CreateWindow("button", "Submit This", 
       WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 
       300, 170, 120, 30, 
       hwnd, (HMENU)BTN_BUTTON, GetModuleHandle(NULL), NULL); 

      break; 
     case WM_DESTROY: 
      PostQuitMessage (0);  /* send a WM_QUIT to the message queue */ 
      break; 
     default:      /* for messages that we don't deal with */ 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 

    return 0; 
} 

现在,如果我忽略了,我深深地希望我的代码部分列表框的代码一切都在我的代码运行完美。在创建列表框编译评论

error: "LBS_COMBOBOX" was not declared in this scope

功能但它是好的,有LBS_NOTIFY。如果有人启发我阻止我的cpp程序运行,我将不胜感激。我在这方面仍然是一个新手,我可能忽略了某些东西。

这是editted版本

+1

为什么你有独立的功能于一身的头文件? – PaulMcKenzie

+0

我已经解释过我刚开始先生 –

+0

根据MSDN [列表框样式](https://msdn.microsoft.com/en-us/library/windows/desktop/bb775149(v = vs.85).aspx ),'LBS_COMBOBOX'需要'#include '。我不确定在C++ 11(及更高版本)中是否仍然需要它,但是我会用标题中的实体作为“静态内联”进行标记。 – Scheff

回答

1

这里是一个快速帮助yoou的链路上创建一个基于教程列表框这里http://winapi.foosyerdoos.org.uk/index.php

HWND CreateListbox(const HWND hParent,const HINSTANCE hInst,DWORD dwStyle, const RECT& rc,const int id,const ustring& caption) 
{ 
    //dwStyle|=WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_DISABLENOSCROLL|LBS_NOSEL; 
    dwStyle|=WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_DISABLENOSCROLL|LBS_NOTIFY; 
    return CreateWindowEx(WS_EX_CLIENTEDGE, _T("listbox"), 
     caption.c_str(), 
     dwStyle, 
     rc.left, rc.top, rc.right, rc.bottom, 
     hParent, 
     reinterpret_cast<HMENU>(static_cast<INT_PTR>(id)), 
     hInst, 0); 
} 
2

你不应该使用LBS_COMBOBOX无论如何,它是由Windows使用的内部风格:

The combo box itself must set this style. If the style is set by anything but the combo box, the list box will regard itself incorrectly as a child of a combo box and a failure will result.

也许你的SDK不包括定义这种风格,因为你不应该设置它。

+0

我没有使用任何SDK只是代码块的裸露的代码 –

+0

除非你自己编写了Windows.h,否则你必须有某种类型的SDK。如果你正在用MinGW/GCC编译,那么你可能使用他们的win32头文件(“w32api”是它的名字)。 – Anders

相关问题