0

C++ が好きで、windows ライクなアプリケーションを作成したいので、win32 を試すことにしました。今ではかなりうまくいっています(私は思う)。それにもかかわらず、私は問題を抱えています。

2 つのボタンを持つアプリケーションを作成したいと考えています。1 を押すと、もう 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);
}
4

1 に答える 1

1

コントロールウィンドウにアクセスするには2つの方法があります。1つは、CreateWindowExによって返されたものを保存しHWND、コントロールにアクセスする必要があるたびにそれを使用することです。もう1つは、親ウィンドウと、コントロールの作成時に割り当てたIDがGetDlgItemわかっている場合に呼び出すことです。これにより、コントロールのが返されます。明らかに、元の値は変更されないため、元の値を保存する方が簡単です。HWNDHWND

于 2013-02-21T20:07:51.820 に答える