创建win32 API C ++后访问组件

时间:2013-02-21 19:52:42

标签: c++ winapi

喜欢c ++并且想要创建一个类似Windows的应用程序,我决定尝试使用win32。现在这个问题相当不错(我认为)。不过我发现自己遇到了问题。

我想创建一个有2个按钮的应用程序。当按下1时,另一个不再可见(非常有用)。

问题

我似乎无法访问我在应用程序中创建的按钮。如何在CALLBACK中访问创建的按钮。我很确定这是一个相当无聊的问题,但它肯定会帮助我前进。

到目前为止我做了什么(不包括所有代码)

enum {
  IDBC_DEFPUSHBUTTON=200
};

//Prototype functions
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int OnCreate(const HWND,CREATESTRUCT*);
HWND CreateButton(const HWND,const HINSTANCE,DWORD,const RECT&,const int,const ustring&);
inline int ErrMsg(const ustring&);

//Main
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR pStr,int nCmd) {
   ...
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    switch (uMsg) {
    case WM_CREATE: //APP-CREATE
        return OnCreate(hwnd,reinterpret_cast<CREATESTRUCT*>(lParam));
    case WM_COMMAND:
        switch(LOWORD(wParam)) {
            case IDBC_DEFPUSHBUTTON: {
                PostQuitMessage(0);
                return 0;
            }
        }
        break;
    case WM_DESTROY: //APP-END
        PostQuitMessage(0);
        return 0;
    default:
       return DefWindowProc(hwnd,uMsg,wParam,lParam);  
    }
}

onCreate函数创建所有按钮,并与CALLBACK一起工作(当我点击按钮时,应用程序实际退出!(测试目的))。而不是那么

  

PostQuitMessage(0)

我想要像:

  

IDBC_DEFPUSHBUTTON.Visible = false;

以下代码是OnCreate函数和CreateButton函数:

int OnCreate(const HWND hwnd,CREATESTRUCT *cs) {
    RECT rc={10,10,200,40}; //Position Rectangle
    CreateButton(hwnd,cs->hInstance,BS_DEFPUSHBUTTON,rc,IDBC_DEFPUSHBUTTON,_T("DEFAULT PUSH BUTTON"));
    return 0;
}

//Button creation function
HWND CreateButton(const HWND hParent,const HINSTANCE hInst,DWORD dwStyle,const RECT& rc,const int id,const ustring& caption) {
    dwStyle|=WS_CHILD|WS_VISIBLE;
    return CreateWindowEx(0,_T("button"),caption.c_str(),dwStyle,rc.left,rc.top,rc.right,rc.bottom,hParent,reinterpret_cast<HMENU>(static_cast<INT_PTR>(id)),hInst,0);
}

1 个答案:

答案 0 :(得分:1)

有两种方法可以访问控制窗口。一种是保存CreateWindowEx返回的HWND,并在每次需要访问控件时使用它。另一种是如果您知道父窗口的HWND和创建控件时分配的ID,则调用GetDlgItem,这将返回控件的HWND。显然,保存原始值更容易,因为它不会改变。