Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2010, 13:34   #1
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию Сделать окно дочерним

Я создал простое окно со стилем WS_EX_TOOLWINDOW на основе диалога и хочу его определить дочерним по отношению к другому приложению (MapInfo). Вроде получилось, окошко привязалось к программе, но оно:
- не всегда правильно отрисовывается;
- после сворачивания основного окна мое окно не реагирует на клик мsib? пока не сделаешь активным основное окно, хотя на контролы можно нажать.

Окно создаю так:
Код:
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE

#include <windows.h>
#include <windowsx.h>

#include "main.h"

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
	DialogBox(hInst, "Dialogs", NULL, DlgProc);

	return 0;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		HANDLE_MSG(hwnd, WM_INITDIALOG, DlgOnInitDialog);
		HANDLE_MSG(hwnd, WM_COMMAND, DlgOnCommand);
	
	default:
		return FALSE;
	}
}

BOOL DlgOnInitDialog(HWND hwnd, HWND, LPARAM)
{ 
	SetWindowText(GetDlgItem(hwnd, IDC_STATIC), "Текст текст текст...");
	LONG l = GetWindowLong(hwnd, GWL_EXSTYLE); // получаем текущий ExСтиль окна
	l |= WS_EX_TOOLWINDOW; // добовляем наш стиль
	//l |= WS_EX_MDICHILD;
	SetWindowLong(hwnd, GWL_EXSTYLE, l); // ставим стиль
	EnableWindow(hwnd, 1);

	return TRUE; 
}

void DlgOnCommand(HWND hwnd, int id, HWND, UINT)
{
	switch(id)
	{
	case IDCANCEL:
		EndDialog(hwnd,0);
	}
}
Вот так я делаю его дочерним (это уже другая программа):
Код:
hWndMain = FindWindow(NULL, "MapInfo Professional");
if(hWndMain == NULL)
	cout << "MI not run or not found!" << endl;
else
{
	hWnd = FindWindow(NULL, "Заголовок");
	SetParent(hWnd, hWndMain);
}
Изображения
Тип файла: jpg Q2.jpg (8.0 Кб, 45 просмотров)
Тип файла: jpg Q1.jpg (54.7 Кб, 43 просмотров)
Вложения
Тип файла: rar prog.rar (1,000 байт, 4 просмотров)
Qwe1 вне форума Ответить с цитированием
Старый 02.12.2010, 13:48   #2
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

самый лучший способ сделать твое окно дочерним в MapInfo, поместить окно в Dll, и написать вызов из программы написанной на MapBasic'e.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 02.12.2010, 14:50   #3
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Я переделал exe в dll, заменив WinMain на экспортную функцию (ее я вызываю из MI), но DialogBox возвращает "-1".
Код:
extern "C" __declspec(dllexport) int ShowDlg(LPCSTR);
HINSTANCE hInst;

//int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
extern "C" __declspec(dllexport) int ShowDlg(LPCSTR titleDlg)
{
	return DialogBox(hInst, "Dialogs", NULL, DlgProc);
}

<...>

Последний раз редактировалось Qwe1; 02.12.2010 в 14:58.
Qwe1 вне форума Ответить с цитированием
Старый 03.12.2010, 07:23   #4
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

к сожелению C++ я не знаю, но если хочешь могу навоять пример на delphi.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 03.12.2010, 08:38   #5
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Сейчас задача сузилась: нужно для начала вызвать диалог из DLL. Как это сделать? На Delphi? Если и там чистый WinAPI - то можно, посмотрю, спасибо.
Qwe1 вне форума Ответить с цитированием
Старый 03.12.2010, 09:52   #6
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Вот тебе архивчик, разбирайся.
Вложения
Тип файла: rar WindowFormDll.rar (36.4 Кб, 22 просмотров)
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 03.12.2010, 10:07   #7
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Спасибо, посмотрю повнимательней. Но это ведь модальное окно, то есть пока его не закроешь работать дальше нельзя, а можно сделать его немодальным и убрать из таскбара?
Qwe1 вне форума Ответить с цитированием
Старый 03.12.2010, 12:06   #8
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Держи... Подправил DLL, изучай
Вложения
Тип файла: rar WindowInMI.rar (36.4 Кб, 9 просмотров)
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 03.12.2010, 12:21   #9
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

А можно сделать так, чтобы это окно сворачивалось при сворачивании окна MI, теряло фокус, когда и основное окно теряет фокус и т.д.? То есть вело бы себя как дочернее? Еще заметил, что когда закрываешь окно из DLL, закрывается и окно MI, а если наоборот - MI вылетает.
Qwe1 вне форума Ответить с цитированием
Старый 03.12.2010, 13:02   #10
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Подправил dll:
1. вместо закрытия, прячем окно (тогда не будет закрываться MI);
2. что бы окно вело как дочернее, необходимо перехватывать сообщения для MI, т.е. ставь хуки на окно MI.
Вложения
Тип файла: rar Window.rar (36.4 Кб, 7 просмотров)
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать при нажатии кнопки новое окно quarty Общие вопросы Delphi 9 01.11.2010 14:06
как сделать что новое окно не открывалось,а... DimOn4Ik Общие вопросы Delphi 10 15.10.2009 09:37
Как сделать, чтобы модальное окно закрылось по условию? DrMcSheen Общие вопросы C/C++ 2 24.08.2009 15:54
Как сделать окно дочерним? abdyla_v Win Api 0 25.08.2008 20:24
Помогите сделать окно авторизации пользователей HAMMAN Помощь студентам 2 09.05.2008 00:02