0

ここに書いたものから特定の位置にあるボタンのサイズを変更する方法を知りたかったのですが、ボタンは画面全体に表示されます。助けてください

.hと.cppの代わりに.cppファイルを使用しています

enum
{
    BUTTON_Generate = 2, 

};
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( _("Key Generator"), wxPoint(1, 1),wxSize(450, 450));
 frame->Connect( BUTTON_Generate, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)      
 &MyFrame::OnAbout);

}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{

GenerateKey = new wxButton(this, BUTTON_Generate, _T("Generate Key"), wxPoint(200,    
200), wxSize(10,10), 0); 

}

しかし、私が書いた場合:別のボタン:

 GenerateKey2 = new wxButton(this, BUTTON_Generate, _T("Generate Key"), wxPoint(200,   
    200), wxSize(10,10), 0); 

両方のボタンが指定された位置に配置されていることを示していますが、単一のボタンを宣言する場合は、フレーム全体にボタンが引き伸ばされていることを示しています。なぜそうなのですか。

エマ

4

2 に答える 2

1

問題は、ボタンのウィンドウ ID に値 2 を割り当てたことだと思います。この値は wxWidgets によって内部的に使用されます。

wxWidgets で使用される ID と競合しないウィンドウ ID を設定するには、次の行に沿って何かを行います。

// IDs for the controls and the menu commands
enum ControlIDs {

  lastwxwidgetid = wxID_HIGHEST,

  BUTTON_Generate;

};

これにより、新しい ID が wxWidgets で使用されるよりも高くなります。

VZ.の答えは正しいようです。ただし、競合するウィンドウ ID の割り当てには注意する必要があります。最終的には、デバッグが非常に困難な奇妙な動作に遭遇することになります。

于 2012-07-17T15:24:26.630 に答える
1

wxFrame ドキュメントに記載されているように、 の唯一の子はwxFrame常にクライアント領域全体に合わせてサイズ変更されます。

ただし、サイズ変更イベントを自分で処理する場合を除きます。

wxFrame は次のイベントを処理します。

wxEVT_SIZE: フレームに子ウィンドウが 1 つだけある場合 (ステータスとツールバーを除く)、この子ウィンドウはフレーム クライアント領域全体を占めるようにサイズ変更されます。2 つ以上のウィンドウが存在する場合は、wxEVT_SIZE を手動で処理するかサイザーを使用して、明示的にレイアウトする必要があります。

これは、フレームの子として を作成し、すべてのコントロールをこのパネルの子としてwxPanel作成する理由の 1 つです (もう 1 つは、キーボード ナビゲーションを機能させるために使用する必要があるためです)。wxPanel

ところで、いずれにしてもうまくいかない絶対配置の代わりにサイザーを使用することを検討してください。

于 2012-07-21T17:58:06.323 に答える