2013-03-17 3 views
1

Я хотел бы сделать кнопку с динамической шириной. Вот мой код:C++ custom button icon

CreateWindowEx(BS_PUSHBUTTON, "BUTTON", "OK", 
      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
      50, 220, 100, 24, hwnd, 
      (HMENU)ID_BUTTON, 
      GetModuleHandle(NULL), 
      0); 

Но если я изменить метку «OK», чтобы «НЕЧТО ДОЛЬШЕ», то кнопка не достаточно широк. Как установить динамическую ширину?

+0

[AdjustWindowRect] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632665 (v = vs.85) .aspx), [SetWindowPos] (http: // msdn. microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx), [MoveWindow] (http://msdn.microsoft.com/en-us/library/windows/desktop/ ms633534 (v = vs.85) .aspx) – chris

ответ

3

Пробег: Button_GetIdealSize macro.


OK, Дэвид, пожалуйста, в следующий раз поставки больше информации, упомянуть все, что вы не понимаете, потому что из ваших вопросов в комментариях, я могу сделать вывод, что вы не незнакомы только с Win API, но вы также очень новый для программирования C/C++ в целом.

HWND buttonHandle = CreateWindowEx(BS_PUSHBUTTON, "BUTTON", "OK", 
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
            50, 220, 100, 24, 
            hwnd, 
            (HMENU)ID_BUTTON, 
            GetModuleHandle(NULL), 
            0); 
SIZE size; 

if (!Button_GetIdealSize(buttonHandle, &size)) { 
    // Call of `Button_GetIdealSize` failed, do proper error handling here. 
    // For that you have various options: 
    // 1. Exit current scope and return error code; 
    // 2. Throw an exception; 
    // 3. Terminate execution of your application and print an error message. 
    // Of course these options can be mixed. 
    // If you don't understand what I'm talking about here, then either skip this 
    // check or start reading books on software development with C/C++. 
} 

// At this point `size` variable was filled with proper dimensions. 
// Now we can use it to actually resize our button... 

if (!MoveWindow(buttonHandle, 50, 220, (int)size.cx, (int)size.cy, TRUE)) { 
    // Call of `MoveWindow` failed, do proper error handling here, again. 
} 

// We are done! 

ПРИМЕЧАНИЕ: Название Вашего вопроса некорректна. C++ не имеет ничего общего с кнопками и Win API, в частности, что является чистым C. Гораздо лучше заголовок будет: Win API: Как правильно изменить размер кнопки, чтобы она соответствовала ее содержимому?

+0

спасибо! Но как? – David

+0

Я думаю, что в документации говорится о том, как ее использовать. Макрос принимает 2 параметра: дескриптор кнопки и указатель на структуру 'SIZE', которая будет заполнена соответствующими размерами при вызове макроса. Таким образом, когда вы вызывали 'CreateWindowEx', он возвращал вам дескриптор вновь созданной кнопки. Теперь передайте этот дескриптор в 'Button_GetIdealSize', как указано в документации. Как только вы получите размер из этого макроса, вы можете использовать функцию [MoveWindow] (http://msdn.microsoft.com/en-us/library/ms633534 (v = vs.85) .aspx), чтобы изменить размер кнопки , –

+0

BOOL Button_GetIdealSize ( HWND hwnd, РАЗМЕР * pSize ); Как я могу получить pSize? – David