Ну про MFC ничего писать не буду... не мой это метод... ну а про Win API рассказываю
пусть кто-то (что-то) создал окно, пусть для определенности это стандартное окно OpenFile созданное например функцией "BOOL GetOpenFileName(LPOPENFILENAME lpofn);" причем совершенно не важно создано оно вами или нет, главное при программировании на Win API ни много ни мало знать дискриптор этого окна (это тоже легко делается
) ну а далее лишь дело техники...
например, пусть мы уже имеем parentHandle того окна куда мы хотим засодить новый элемент управления. Да еще нам нужен дискриптор экземпляра приложения, пусть это hInstance он.
Ну ясное дело, что новый элемент управления, например кнопка, добаляется так:
const long ICD_MyMegaNewButton = 12345;
HWND NewButtonHandle = CreateWindow( "BUTTON", "MyMegaNewButton",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
20,
20,
100,
100,
parentHandle, // вот оно
(HMENU)ICD_MyMegaNewButton,
hInstance,
NULL);
ну размеры и расположение кнопки надо заменить нужными, а ICD_MyMegaNewButton нужен для того чтобы при нажатию (а точнее по любому событию которое кнопка передает родительскому окну) можно было это событие обработать. Далее надо раздобыть указатель funcWindowPtr на функцию обработки сообщений РОДИТЕЛЬСКОГО окна делаем это:
WNDPROC funcWindowPtr = (WNDPROC)GetWindowLong(parentHandle, GWL_WNDPROC);
отлично, теперь подменим функцию обработки сообщений родительского окна, которая была определена при создании окна (назовем ее - базовая функция обработки сообщений родительского окна), на нашу NewWndProc, примерно так (читаем комментарии).
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewWndProc);
// SetWindowLong(hWnd, GWL_WNDPROC, NewWndProc);
// Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
// Если таки надо у окна в другом процессе подменить функциональности, то это все равно можно сделать )))
простой пример нашей функции обработки сообщений родительского окна, которая обрабатывает, как все то, что обрабатывала базовая функция обработки сообщений, так и события нашей новой кнопки, примерно так:
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (WM_COMMAND == message && LOWORD(wParam) == ICD_MyMegaNewButton)
{
MessageBox(hWnd, "Bububububu", "Bububububu", MB_OK);
return 0;
}
if (funcWindowPtr)
return CallWindowProc(funcWindowPtr, hWnd, message, wParam, lParam);
return 0;
}
функция CallWindowProc вызывает стандартную функцию обработки сообщений (мы это делаем если сообщение не относится к нашей кнопке, так как оно, это я про сообщение
возможно !!! обрабатывается стандартной функцией), мы можем это сделать так, как предусмотрительно сохранили указатель на нее (вот он funcWindowPtr). Ну вот теперь при нажатии на нашу кнопку будет выдаваться на экран MessageBox с сообщением и заголовком "Bububububu".
Собственно и ВСЕ!!!