Консультация № 171518
21.08.2009, 21:13
0.00 руб.
0 5 1
Здравствуйте!
Скажите, пожалуйста, как на моей форме создать кнопку и сделать обработчик событий под нее, т.е. чтобы по нажатии что-то происходило? Чего-то никак найти не могу, как это делать.. Я только начал изучать VC++. Для создания формы использовал код, который в приложении.
Помогите, пожалуйста.
Спасибо!

Приложение:


#include <windows.h>
#include <stdio.h>


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Window Class 1";
wndclass.hIconSm = LoadIcon (NULL, IDI_WINLOGO);
RegisterClassEx (&wndclass);
hwnd = CreateWindow ("Window Class 1", // имя класса окна
"My First Window", // заголовок окна
WS_OVERLAPPEDWINDOW, // стиль окна
CW_USEDEFAULT, // начальное положение x
CW_USEDEFAULT, // начальное положение y
CW_USEDEFAULT, // начальное положение x
CW_USEDEFAULT, // начальное положение y
NULL, // ссылка на родительское окно
NULL, // ссылка на меню окна
hInstance, // ссылка на экземпляр программы
NULL); // для WndProc



ShowWindow (hwnd, iCmdShow);

UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}


UnregisterClass("Window Class 1", hInstance);

return msg.wParam ;
}



LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{


switch (iMsg)
{
case WM_CREATE:
break;

case WM_SIZE:
break;

case WM_PAINT:
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
}


return DefWindowProc (hwnd, iMsg, wParam, lParam);
}



Обсуждение

Неизвестный
22.08.2009, 10:48
общий
AkaProc:
После VB6, я бы Вам порекомендовал все-таки C# или VB.Net. Их Вам будет гораздо проще использовать. Окошки "рисовать" там можно также, как и в VB6. А под C++ даже при помощи MFC это не очень продуктивно будет.
Для своих целей поизучайте следующие разделы:
System.Threading (особенно Thread)
System.IO (Stream, FileStream)
System.Net.Sockets (Socket)
В MSDN есть описания этих классов, примеры их использования и статьи, которые описывают логику работы в какой-то области вообще. Особенно для Threading это полезно. Там черт ногу сломит :)
В Студии создаете проект Windows Forms Application для C# или VB.Net - и очень скоро сориентируетесь.
Неизвестный
22.08.2009, 13:19
общий
Спасибо, попробую на С#.
давно
Посетитель
7438
7205
25.08.2009, 11:21
общий
это ответ
Здравствуйте, AkaProc.
Ваша программа написана на чистом WinAPI, поэтому и ответ на WinAPI.
Необходимые изменения в Вашей программе смотрите в приложении.
Добавлю только, что кроме создания органов управления "ручками" (как в этой программе),
можно создать диалог по заранее описанному шаблону диалога в ресурсах.



Приложение:

#include <windows.h>

//Зададит идентификатор кнопки
#define IDC_BUTTON 100

//Здесь будем хранить код экземпляра программы
HINSTANCE hInst;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst = hInstance; // сохраним код экземпляра программы в hInst !!!!!!!!!!!!!!

wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Window Class 1";
wndclass.hIconSm = LoadIcon (NULL, IDI_WINLOGO);
RegisterClassEx (&wndclass);
hwnd = CreateWindow ("Window Class 1", // имя класса окна
"My First Window", // заголовок окна
WS_OVERLAPPEDWINDOW, // стиль окна
CW_USEDEFAULT, // начальное положение x
CW_USEDEFAULT, // начальное положение y
CW_USEDEFAULT, // начальная ширина !!!!!!!!!!!!!!!!
CW_USEDEFAULT, // начальная высота !!!!!!!!!!!!!!!!
NULL, // ссылка на родительское окно
NULL, // ссылка на меню окна
hInstance, // ссылка на экземпляр программы
NULL); // для WndProc



ShowWindow (hwnd, iCmdShow);

UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}


UnregisterClass("Window Class 1", hInstance);

return msg.wParam ;
}



LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HWND hButton;

switch (iMsg)
{
case WM_CREATE:
//создадим кнопку, как окно класса button
hButton = CreateWindow ("button", // имя класса окна
"Нажми меня", // заголовок окна
BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, // стиль окна кнопки
50, // x
50, // y
100, // ширина
30, // высота
hwnd, // handle родительского окна (кому будут посылаться сообщения)
(HMENU)IDC_BUTTON, // идентификатор кнопки
hInst, // ссылка на экземпляр программы
NULL); // ф-я окна не нужна для кнопки
if (hButton) //на всякий случай проверим создалась кнопка
SetFocus(hButton) ; //дадим кнопке фокус клавиатурного ввода
break;

case WM_SIZE:
break;

case WM_PAINT:
break;

case WM_COMMAND:
//нажатие на кнопку приходит, как сообщение WM_COMMAND, параметром wParam идентификатор дочернего окна (кнопки)
if (wParam == IDC_BUTTON)
{
//что-то делаем
MessageBox(hwnd, "Нажали на кнопку", "My First Window", MB_OK);
SendMessage(hwnd, WM_CLOSE, NULL, NULL); //посылаем себе команду завершения
break;
}
return 1;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc (hwnd, iMsg, wParam, lParam); //все остальные - по-умолчанию
}
return 0; //возвращаем код, говорящий, что мы отработали сообщение
}
5
Спасибо!!! Отличный ответ!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
26.08.2009, 01:31
общий
Очень рекомендую почитать Петцольда "Программирование для Windows 95 в двух томах"
Том 1
Том 2
Основы WinAPI расписаны и разложены по полочкам.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.08.2009, 10:19
общий
Благодарю! Скачал книгу. Обязательно почитаю. :)
Форма ответа