2016-12-04 12 views
0

私はWinAPIにはかなり新しくなっているので、時には多くの基本的な間違いを犯します。あなたは警告されました、私の問題に移りましょう:P/ボタンのテーブルを処理する(WinAPI)

グリッドのようなものを作りたいと思います。グリッドのフィールドの1つをクリックすると、ビットマップが表示されます。私はボタンとして使用したいフィールドのビットマップを作った。最初のユーザーはグリッドのサイズを入力するので、私はそのビットマップでボタンの動的ライブラリを作成しました。残念ながら、クリックしたときの対処方法はわかりません。ここに私のコードだ:

WindowProcedureで
//there I create my window. I also make a global variable bool* table and HWND next. 
table = new bool[x*y]; 
for (int i = 0; i < x*y; ++i) 
    table[i] = 0; 
//the table represents if the fields are already filled or not. 

HWND* buttons = new HWND[x*y]; 
next = CreateWindowEx(4, _T("BUTTON"), _T("MOVE"), WS_CHILD | WS_VISIBLE, x * 12 - 25, (y + 4) * 25 - 90, 100, 50, hwnd, NULL, hThisInstance, NULL); 

for (int i = 0; i < x; ++i) 
{ 
    for (int j = 0; j < y; ++j) 
    { 
     buttons[i + j * x] = CreateWindowEx(0, _T("BUTTON"), NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 0 + i * 25, 0 + j * 25, 25, 25, hwnd, NULL, hThisInstance, NULL); 
     SendMessage(przyciski[i + j * x], BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)field); 
    } 
} 

そして今、():

switch (message) 
    { 
     case WM_COMMAND: 
      if ((HWND)lParam == next) /* there will be some code in the future ;) */; 
      else 
      { 
       //So here I need to set correct the value in table to 1 
       //I have a handle to clicked button (HWND)lParam, but I don't know how to get it's position in the table 
      } 
      break; 

私はHWNDとint型のx、yはいくつかの構造体を実行しようとしましたが、私はまだこれを管理する方法がわかりません。ところで、コードは非常に古いように見えるかもしれませんが、私はWindows XPが実行できるアプリケーションを作成する必要があります(それは学校向けのプロジェクトです。Pに問い合わせないでください)。さらに、私は非常に古いチュートリアルを使用します。

+1

ループスルーボタンアレイ、および一致するHWND値、いいえ? – OldProgrammer

+0

ええ...どうしたのですか?それはとても明らかです...ありがとう! :D – Executor1909

+1

すべてのボタンに一意のIDを割り当てる必要があります。このIDは 'WM_COMMAND'の' LOWORD(wParam) 'に戻されます。あなたが '256x256'グリッドよりも大きくないと思うなら、IDは' 256 * y + x'の形式になります。 – RbMm

答えて

1

HMENUパラメータを使用して各ボタンのIDを割り当てます。 IDは、任意のオフセットを追加するため、ゼロにすることはできません、例えば100ため:

buttons[i + j * x] = CreateWindowEx(0, _T("BUTTON"), NULL, 
    WS_CHILD | WS_VISIBLE | BS_BITMAP, 0 + i * 25, 0 + j * 25, 25, 25, 
    hwnd, HMENU(100 + i + j * x), hThisInstance, NULL); 

また、総行と合計列を知ること、button_indexから行と列を抽出することができます。例:

case WM_COMMAND: 
{ 
    if (HIWORD(wParam) == BN_CLICKED) 
    { 
     int id = LOWORD(wParam); 
     int button_index = id - 100; 
     if (button_index >= 0 && button_index < x * y) 
     { 
      int row = button_index/x; 
      int column = button_index % x; 
      ... 
     } 
     ... 
    } 
    break; 
} 
関連する問題