Подскажите кто знает как вывернуться из такой ситуации:
Я создаю кнопку и добавляю ее на ст. CommonDialog-Open. Но проблема в том, что места там не очень много и кнопка хоть и смотриться поверх всех элементов окна диалога, однако нажиматься не хочет.
Например, я помещаю свою кнопку в верхн. правый угол окна, там пустое место (сразу после кнопки "меню Вид"), но на самом деле, там еще тулбар продолжается. И вот в тех местах, где этот тулбар пересекается с моей кнопкой — кнопка нажиматься не хочет. Вообще это относится ко всем элементам и даже подписи (STATIC) и то находятся под кнопкой, но нажимать ее не дают в тех местах где они пересекаются с кнопкой, при нажатии на эти места фокус тут же убегает на кнопку — "Открыть". Как это можно обойти?
Создаю я кнопку так... привязываю ее к hWnd гл. окна CommonDialog:
Кажись понял, завтра буду разбираться ... наконец попал на статью с MSDN — Explorer-Style Custom Templates пока понял токо что надо свои доп. контролы должны иметь соотв. стили чтобы их не перекрывали станд. контролы
Здравствуйте, <Аноним>, Вы писали:
А>Кажись понял, завтра буду разбираться ... наконец попал на статью с MSDN — Explorer-Style Custom Templates пока понял токо что надо свои доп. контролы должны иметь соотв. стили чтобы их не перекрывали станд. контролы
This article describes how to go beyond the normal customization associated with the Windows common file open dialog. The common file open dialog is easily one of the most often customized entity in the Windows world, but given the limited customization options included with it, it usually isn't very intuitive as to how go about customizing it the way you want. This article tells you how to make it look and behave the way you want it to. Readers are reminded that though the following ideas and concepts deal with the common file open dialog, the techniques presented here can easily be applied to any other common dialog as well.
The included source files will allow you to use the Office 2000 and VS.NET style file dialogs in your applications, which will appear on all versions of Windows 95/98/NT/Me, as well as 2000. To use the dialog, simply add the source files to your project and use the standard CFileDialog calling functions to show / manipulate it.
This article will demonstrate how to resize the instance of a subclassed CFileDialog and then add a 'SelectAll' button that will select all files (but not folders) in the currently displayed folder. The article assumes that you already know how to subclass MFC provided classes and deal with the associated issues. We therefore will concentrate on how to resize the dialog and re-layout the controls on it (so that they properly cover the enlarged dialog window area). Then, we will show how to add the button, capture the user clicks on it and select all currently displayed files in response.
Everyone is familiar with the standard 'File Open' and 'File Save' common dialogs. Microsoft has done a great job of providing advanced functionality for these controls. Each of them is essentially a miniature version of Windows Explorer: in addition to presenting a list of files, the user can drag files within the list, create new folders, rename files, drag-n-drop new files into the dialog from outside, and cut, paste or delete files. These operations are all available right in the middle of Opening or Saving the current file.
But what if you don't want to offer the user that much freedom? The common dialogs offer a lot of powerful features, but is there any way of limiting those features?
In one of our company projects we needed a way to limit a common dialog's functionality to providing a strictly read-only view of files in a folder. This article presents the solution we came up with.
I wanted to import images in various formats into my application. These images could have come from a digital camera or from a scanner and don't necessarily have intelligible names. Look at the filename in the sample picture above. It doesn't exactly drip with meaning.
So it was obvious that I needed to show a preview image in the file import dialog. As the user clicks on files in the ListView the preview control updates to show the image. Naturally I turned to CodeProject to see if anyone had already implemented such a beast. If they have I couldn't find it, so I rolled my own.
[ posted via RSDN@Home 1.1.4 beta 3 r241, accompanied by Rainbow — Catch The Rainbow ]
Спасибо за примеры, разбираюсь с ними, к сожалению они все исповедуют одну мысль — создание dialog на основе своего templates. Для этого надо создать и использовать res файл....у меня задачи несколько иные
Посколько все это пишется для макроса под Excel-VBA, то очень не хотелось бы связываться с доп. файлами: res, dll, ocx и т.д. которые надо таскать за модулем макроса. Поэтому мне надо добавить свои контролы на окно common dialog на лету, сразу после создания..так что приходится топать своей дорогой
Что то в MSDN я прочитал что можно сохранить стиль OFN_EXPLORER при установке своей hook функции — у меня что-то так не получается, как только я выставляю флаг OFN_ENABLEHOOK на WIN2000 открывается common dialog в СТАРОМ стиле. В принципе это конечно для меня не критично, но просто интресно, можно сохранить OFN_EXPLORER со своим hook или нет?
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо за примеры, разбираюсь с ними, к сожалению они все исповедуют одну мысль — создание dialog на основе своего templates. Для этого надо создать и использовать res файл....у меня задачи несколько иные
Не обязательно.
OFN_ENABLETEMPLATEHANDLE
Indicates that the hInstance member identifies a data block that contains a preloaded dialog box template. The system ignores the lpTemplateName if this flag is specified.
А>Что то в MSDN я прочитал что можно сохранить стиль OFN_EXPLORER при установке своей hook функции — у меня что-то так не получается, как только я выставляю флаг OFN_ENABLEHOOK на WIN2000 открывается common dialog в СТАРОМ стиле. В принципе это конечно для меня не критично, но просто интресно, можно сохранить OFN_EXPLORER со своим hook или нет?
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Не обязательно.
SDB>
SDB>OFN_ENABLETEMPLATEHANDLE
SDB>Indicates that the hInstance member identifies a data block that contains a preloaded dialog box template. The system ignores the lpTemplateName if this flag is specified.
Запустить не могу, у меня токо VB6 стоит, так что я просто исходный код изучал.
По поводу OFN_ENABLETEMPLATEHANDLE я не очень понял.
В своем коде OFN_ENABLETEMPLATEHANDLE использовать не могу, потому что мне не на что указывать, как я сделаю preloaded dialog box template??? а так, если просто добавить флаг OFN_ENABLETEMPLATEHANDLE то при создании диалога получаю ошибку номер 3
Здравствуйте, <Аноним>, Вы писали:
А>Запустить не могу, у меня токо VB6 стоит, так что я просто исходный код изучал.
Диалог будет "новостильным".
А>По поводу OFN_ENABLETEMPLATEHANDLE я не очень понял. А>В своем коде OFN_ENABLETEMPLATEHANDLE использовать не могу, потому что мне не на что указывать, как я сделаю preloaded dialog box template??? а так, если просто добавить флаг OFN_ENABLETEMPLATEHANDLE то при создании диалога получаю ошибку номер 3
Найдите в MSDN описание структур DLGTEMPLATE/DLGITEMTEMPLATE — там подробно все расписано. А дальше Вам останется только выделить блок памяти требуемого размера с помощью GlobalAlloc(), закинуть в эту память данные и указать дескриптор в поле hInstance структуры OPENFILENAME (не забыв конечно и флаг OFN_ENABLETEMPLATEHANDLE).
Спасибо за наводку, изучил... тяжеловато конечно будет на VB заполнить все эти структуры и правильно их разместить в памяти... пока хочу попробовать создавать на контролы на лету и привязывать их к окну диалога.. своих проблем там правда тоже хватает. Пока бьюсь над задачей — добавляем контролы имеют по умолч. большой жирный шрифт, пытаюсь сразу после создания своего контрола полсать ему сообщение WM_SETFONT с новым шрифтом, но ничего не меняется, хотя вроде в MSDN писали что можо прям в событии инициализации диалога посылать своим контролам WM_SETFONT....где же я тогда напартачил
Re[8]: Кнопка поверх...
От:
Аноним
Дата:
08.12.04 13:35
Оценка:
А>Пока бьюсь над задачей — добавляем контролы имеют по умолч. большой жирный шрифт, пытаюсь сразу после создания своего контрола полсать ему сообщение WM_SETFONT с новым шрифтом, но ничего не меняется, хотя вроде в MSDN писали что можо прям в событии инициализации диалога посылать своим контролам WM_SETFONT....где же я тогда напартачил
Через полдня наконец разобрался, просто была не правильно задекларирована функция SendMessage, не тот тип ждала она... с VB под winAPI надо держать ухо востро
Теперь токо осталось разобраться с GROUPBOX, он себя любопытно ведет, фон внутри этого GROUPBOX почему то не перерисовывает, там остается изображения части других окон, а когда закрываешь все окно диалога, то потом он закрашивает начинку GROUPBOX белым — типа цвет по умолч. пошел разбираться дальше
Re[9]: Кнопка поверх...
От:
Аноним
Дата:
08.12.04 15:36
Оценка:
А>Теперь токо осталось разобраться с GROUPBOX, он себя любопытно ведет, фон внутри этого GROUPBOX почему то не перерисовывает, там остается изображения части других окон, а когда закрываешь все окно диалога, то потом он закрашивает начинку GROUPBOX белым — типа цвет по умолч. пошел разбираться дальше
Необходимо отобрать у гл. окна диалога стиль — WS_CLIPCHILDREN чтобы он начал рисовать нормально (а не просвечивать). Однако это еще не все. Контролы внутри GROUPBOX при этом перестают отображаться, чтобы этого избежать мне пришлось убрать у этих контролов стиль — WS_CLIPSIBLINGS (несмотря на рекомендации MSDN о стиле добавляемых контролов на диалог). Т.е.:
Гл. окно диалога:
....
WS_CLIPSIBLINGS
Not WS_CLIPCHILDREN (т.е. отбираем стиль у окна)
Контрол внутри GROUPBOX:
WS_VISIBLE
WS_CHILD
WS_CLIPCHILDREN
Not WS_CLIPSIBLINGS
DS_3DLOOK
DS_CONTROL
В окнах других программ через Spy++ я смотрел контролы внутри GROUPBOX имели WS_CLIPSIBLINGS, но тогда parent window GROUPBOX не имело WS_CLIPSIBLINGS...проверить это на станд. диалоге open невозможно, потому что у него отобрать WS_CLIPSIBLINGS у меня не получилось... так что приходится строить токо предположения, что если гл. окно имеет WS_CLIPSIBLINGS, то контролы внутри GROUPBOX НЕ ДОЛЖНЫ иметь WS_CLIPSIBLINGS...видимл в этом кроется какой-то смысл
Небольшое дополнение:
походя выяснился еще один момент — контролу BS_AUTORADIOBUTTON нельзя ставить стиль DS_3DLOOK — иначе не показывается на окне диалога
Здравствуйте, SergeySV, Вы писали:
SSV>походя выяснился еще один момент — контролу BS_AUTORADIOBUTTON нельзя ставить стиль DS_3DLOOK — иначе не показывается на окне диалога
Гх-м-м... DS_3DLOOK — это допусимый стиль диалогового окна, а не элемента управления класса "BUTTON" и назначать ему этот стиль явно не стоит.