Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Предпросмотр файла собственного типа в OpenDialog 
:(
    Опции темы
fridkaratel
Дата 11.7.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Создал программу, которая открывает файлы собственного файла, например, *.abcd

Файл содержит некоторые модели (скажем, рисунки). Этот файл не откроется ничем другим, кроме этой программы.

Как при выборе этого файла в OpenDialog отобразить модель, содержащуюся в нем, как бы предпросмотром в OpenDialog?

Что требуется:
1. При выборе файла в OpenDialog выполнить функцию.
2. В результате функции будет создан TBitmap, который надо поместить в OpenDialog как предпросмотр
PM   Вверх
jonie
Дата 13.7.2008, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



см в функцию GetOpenFileName
параметр OPENFILENAME::lpfnHook (и про темплейт тож не забывайте). гугл найдет примеры.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
fridkaratel
Дата 17.7.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Спасибо за наводку - нашел я материал по этой теме... читал долго, пришлось даже с делфей на си часть кода переводить..

Но вот уже 2ю ночь сижу и не могу дорубиться:

Код

<...>
  HBITMAP bmp;
  switch (Msg)
  {
    case WM_INITDIALOG:
      bmp = (HBITMAP)LoadImage(0, (PATH_APP + "preview.bmp").c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
      SendDlgItemMessage(Wnd, 106, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp);
      break;
  }
<...>


В результате получаю пустое место... картинкой и не пахнет - в чем дело?
PM   Вверх
fridkaratel
Дата 20.7.2008, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Суть вот в чем:
Я хочу поменять картинку в диалоге в RealTime, т.е. при выборе файла в окне диалога... Но у меня не получается ее установить даже при первом открытии....

Вот ресурс:
-----------------------
101 DIALOG 0, 0, 200, 100
STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg"
{
 LTEXT "Preview:", 105, 120, 50, 25, 10, NOT WS_GROUP
 CONTROL "", 106, "STATIC", SS_BITMAP, 80, 0, 300, 30
}
-----------------------

Картинку пытаюсь открыть из файла и назначить контролу 106 при инициализации, но в итоге картинка все равно пустая... ЧТо я не так делаю?
PM   Вверх
mekhanikus
Дата 21.7.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: 1
Всего: 1



Имхо, для "static control" логичней применить STM_SETIMAGE.
PM MAIL   Вверх
fridkaratel
Дата 21.7.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Цитата(mekhanikus @ 21.7.2008,  21:08)
Имхо, для "static control" логичней применить STM_SETIMAGE.

Все зачипись - заработало! Спасибо ;)
А это правильно, что я использую STATIC? Может есть более правильные варианты?

PS: А как отловить выбор файла в диалоге?

Это сообщение отредактировал(а) fridkaratel - 21.7.2008, 14:07
PM   Вверх
fridkaratel
Дата 22.7.2008, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Короче, порылся я в dialogs.pas - и нашел то, что нужно!

Вот код, который берет имя файла:
Код

char Path[MAX_PATH];
SendMessage(GetParent(Wnd), CDM_GETFILEPATH, sizeof(Path), Integer(&Path));
Form1->Caption = Path;


 smile 
PM   Вверх
fridkaratel
Дата 9.8.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Код
/* Hook-функция для диалогового окна */
UINT CALLBACK Dialog_HookProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  if (Msg == WM_NOTIFY)
  {
    if (((OFNOTIFY*)lParam)->hdr.code == CDN_SELCHANGE)  // Сообщение о выборе файла
    {
      char FileName[MAX_PATH];
      SendMessage(GetParent(Wnd), CDM_GETFILEPATH, sizeof(FileName), Integer(&FileName));
      Dialog_PreviewFile(FileName, Wnd);
      return true;
    }
  }

  return false;
}
//---------------------------------------------------------------------------
/* Инициализация диалогового окна и его отображение */
bool Dialog_Execute()
{
  TOpenFilename ofn;

  char szFile[MAX_PATH - 1];
  int Result;

  memset(&ofn, 0, sizeof(TOpenFilename));
  memset(&szFile, 0, MAX_PATH);

  ofn.lStructSize     = sizeof(TOpenFilename);
  ofn.hwndOwner       = Application->MainForm->Handle;
  ofn.hInstance       = HInstance;
  ofn.lpstrFile       = szFile;
  ofn.nMaxFile        = MAX_PATH;
  ofn.lpstrFilter     = "Все файлы (*.*)\0*.*\0";
  ofn.nFilterIndex    = 0;
  ofn.lpstrTitle      = "Открыть файл";
  ofn.lpstrInitialDir = NULL;
  ofn.lCustData       = LPARAM(&Info); // Передаем нашу структуру
  ofn.lpfnHook        = Dialog_HookProc; // Указатель на хук-процедуру
  ofn.lpTemplateName  = MAKEINTRESOURCE(101);
  ofn.Flags           = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
                        OFN_ENABLEHOOK | OFN_ENABLETEMPLATE; // <-- это главное

  Result = GetOpenFileName(&ofn);

  if (Result)
  {
    Info.FileName = ofn.lpstrFile; // Записываем имя файла в структуру
  }

  return Result;
}
//---------------------------------------------------------------------------
/* Предпросмотр файла в диалоговом окне выбора*/
void Dialog_PreviewFile(AnsiString FileName, HWND Wnd)
{
  if (!FileExists(FileName)) return;
  fMain->Caption = FileName;
}
//---------------------------------------------------------------------------


Когда я поднимаюсь на папку вверх (или выбираю быстрый путь слева), то элементы диалога не прорисовываются, пока на них не наведешь курсор... почему?
PM   Вверх
Ant
Дата 11.8.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



UpdateWindow?
PM MAIL   Вверх
fridkaratel
Дата 11.8.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Цитата(Ant @ 11.8.2008,  17:38)
UpdateWindow?

И куда UpdateWindow вставить? smile
PM   Вверх
Ant
Дата 12.8.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



Что-то типа этого, набросал быстро, поэтому не уверен в работоспособности этого кода, но принцип, думаю, понятен.

Код

UINT CALLBACK Dialog_HookProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg) { 
           case WM_NOTIFY : {
                     if (((OFNOTIFY*)lParam)->hdr.code == CDN_SELCHANGE) {
                                  char FileName[MAX_PATH];
                                  SendMessage(GetParent(Wnd), CDM_GETFILEPATH, sizeof(FileName), Integer(&FileName));
                                  Dialog_PreviewFile(FileName, Wnd);
                                  return true;}
           case WM_COMMAND :{
                     UpdateWindow(Wnd);
                     return true;}}

  return false;
}

PM MAIL   Вверх
Ant
Дата 12.8.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



удалил.  smile  Мышь китайская глючит. :(

Это сообщение отредактировал(а) Ant - 12.8.2008, 08:25
PM MAIL   Вверх
fridkaratel
Дата 12.8.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Не получилось... глюк так и остался... Все равно окно не прорисовывается...

Оно прорисовывается, т.е. бордюр, фон, заголовок, список файлов - это есть... Мои контролы тоже видны..

Но вот стандартные кнопки "Вверх", "Назад", "Открыть" и т.п. - они не видны, пока на них не наведешь мышкой... :(
PM   Вверх
fridkaratel
Дата 14.8.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Откопал причину проблемы...

Если я делаю так:
Код
  ofn.Flags           = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK /*| OFN_ENABLETEMPLATE*/;

Окно диалога прорисовывается нормально во время навигации.

Но если я подключаю свой шаблон и добавляю соответствующий флаг:
Код
  ofn.Flags           = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;


То окно не прорисовывается как надо...

В чем может быть проблема?

Это сообщение отредактировал(а) fridkaratel - 14.8.2008, 14:36
PM   Вверх
fridkaratel
Дата 20.8.2008, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Оказалось, что дело в шаблоне...

У меня был такой шаблон:

101 DIALOG 0, 0, 400, 75
STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE
FONT 8, "MS Shell Dlg"
{
LTEXT "Высота:", 100, 68, 0, 30, 10, NOT WS_GROUP
LTEXT "Ширина:", 101, 68, 15, 30, 10, NOT WS_GROUP
LTEXT "12", 103, 100, 0, 15, 10, NOT WS_GROUP
LTEXT "12", 104, 100, 15, 15, 10, NOT WS_GROUP
CONTROL "", 106, "STATIC", SS_BITMAP, 130, 0, 350, 100, WS_EX_CLIENTEDGE
}

Убрал NOT WS_GROUP, а для диалога поставил STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK

И все заработало!  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.