Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: Aleksoid1978
Дата сообщения: 08.04.2011 08:50
ShIvADeSt

Свое окно - надо отловить момент когда перемещение закончилось. Либо другой вариант - каким-то образом при перетаскивании запретить движение по условию.
Автор: ShIvADeSt
Дата сообщения: 08.04.2011 09:31

Цитата:
Взводить некий флаг в обработчике WM_MOVING и проверять/сбрасывать его в обработчиках WM_NCLBUTTONUP и WM_LBUTTONUP. Пойдёт?

И плюс проверку на потерю фокуса (если во время перетаскивания переключились в другое окно).
Автор: V0lt
Дата сообщения: 09.04.2011 16:29
ShIvADeSt

Цитата:
Почитай тут, там предлагается класс по твоей проблеме. Посмотри реализацию, может подойдет

спасибо, но через свойство как-то проще


Есть другая проблема. Нарисовал я дерево с чекбоксами (CTreeCtrl), смотрю, что-то не весело получается..
1) Если я ставлю галку на родительский узел, то на дочерних узлах галки не появляются. Это надо самому что-ли писать?
2) Не нахожу свойства частично поставленная галка. Оно же существует или как?
3) Кликаю по чекбоксам, на нем ставиться галка, но при этом происходит какой-то бред. Надпись справа выделяется на время клика, а потом выделение исчезает (оно возвращается к последнему выделенному узлу). Это мигание можно как-то отключить?
4) Нужно было некоторые узлы выделить программно, но как оказалось, функция SetCheck вообще не работает

Но делают же люди нормальные деревья с чекбоксами, тот же InnoSetup например. Или сами с нуля рисуют?
Автор: V0lt
Дата сообщения: 09.04.2011 20:09
Решения:
1.1) выделяем/снимаем выделение для всех дочерних item

Код: CPPageFormats.h
...
afx_msg void OnTVItemChanged(NMHDR *pNMHDR, LRESULT *pResult);
...

CPPageFormats.cpp
...
BEGIN_MESSAGE_MAP(CPPageFormats, CPPageBase)
ON_NOTIFY(TVN_ITEMCHANGED, IDC_TREE1, OnTVItemChanged)
END_MESSAGE_MAP()
...
void CPPageFormats::OnTVItemChanged(NMHDR *pNMHDR, LRESULT *pResult)//TVN_ITEMCHANGED
{
    NMTVITEMCHANGE* p = (NMTVITEMCHANGE*)pNMHDR;
    if ((p->uStateOld & 0x1000) && (p->uStateNew & 0x2000))
    {
        HTREEITEM hChildItem =m_formats.GetChildItem(p->hItem);
        while (hChildItem) {
            m_formats.SetCheck(hChildItem);
            hChildItem = m_formats.GetNextItem(hChildItem, TVGN_NEXT);
        }
    }
    else if ((p->uStateOld & 0x2000) && (p->uStateNew & 0x1000))
    {
        HTREEITEM hChildItem =m_formats.GetChildItem(p->hItem);
        while (hChildItem) {
            m_formats.SetCheck(hChildItem, false);
            hChildItem = m_formats.GetNextItem(hChildItem, TVGN_NEXT);
        }
    }
}
Автор: HNKTO
Дата сообщения: 29.06.2011 19:54
Как запрограммировать Combo Box Control в Windows.
Причём не созданный командой CreateWindow, а определённый в файле ресурсов
Очень хотелось - бы пример работающего кода, а ещё лучше посоветуйте какую нибудь на нормальном русском языке книжку по программированию элементов Windows Shell, т. к. я в программировании полный чайник.
Заранее спасибо.
Автор: Abs62
Дата сообщения: 29.06.2011 20:36
HNKTO
Ну, если есть желание изучить WinAPI, в самый раз будет начать с "Программирование для Windows 95" Петцольда. И не надо смотреть на "Windows 95" в названии, базовые принципы работы системы остаются теми же и сейчас.
Автор: ShIvADeSt
Дата сообщения: 30.06.2011 01:14
Abs62

Цитата:
Ну, если есть желание изучить WinAPI, в самый раз будет начать с "Программирование для Windows 95" Петцольда. И не надо смотреть на "Windows 95" в названии, базовые принципы работы системы остаются теми же и сейчас.

Единственное исключение, если он хочет сделать ХР стайл контрол (чтобы отрабатывал наведение мыши и прочие красявости), тогда нужно дополнительно (после понимания азов) почитать дополнительно.

Цитата:
Причём не созданный командой CreateWindow, а определённый в файле ресурсов

И еще, если мне память не изменяет, то отдельный контрол нельзя создать в файле ресурсов (меню не в счет), только диалог целиком.
Автор: HNKTO
Дата сообщения: 30.06.2011 21:14

Цитата:
Причём не созданный командой CreateWindow, а определённый в файле ресурсов

Ну типа рисую окно диалога, рисую на нём все контролы, инициализикую их в WM_CREATE диалогового окна, снимаю с них сообщения в WM_COMMAND диалогового окна и WM_SCROLL если это полосы прокрутки.
При таком подходе у меня не получается проинициализировать Combo Box Control, а дальше не знаю т. к. не выходит п1.
Если пишу CreateWindow(hwnd, COMBOBOX, ........) то инициализируется и работает, но цель - именно нарисованная версия.

Про Петзольда знаю. Только мне пока не достаёт мозгов, как набрать текст файлов-ресурсов, чтоб он потом в визуалстудии скомпилировался, а хочется типа щас а не потом.
Всем спасибо и заранее спасибо.
Автор: Abs62
Дата сообщения: 30.06.2011 21:44
HNKTO

Цитата:
Ну типа рисую окно диалога, рисую на нём все контролы,

Где? В редакторе ресурсов? Или по ходу выполнения через CreateWindow?

Цитата:
инициализикую их в WM_CREATE диалогового окна

Диалоги используют WM_CREATE для собственных нужд. Программисту туда лезть не следует. Для пользовательской инициализации элементов используется WM_INITDIALOG. Это сообщение будет послано, когда система создаст окно диалога и все прописанные в ресурсах элементы на нём, но до того, как окно будет показано на экране.

Цитата:
Только мне пока не достаёт мозгов, как набрать текст файлов-ресурсов, чтоб он потом в визуалстудии скомпилировался

Так там же есть собственный редактор ресурсов?
Автор: ShIvADeSt
Дата сообщения: 01.07.2011 00:35

Цитата:
Про Петзольда знаю. Только мне пока не достаёт мозгов, как набрать текст файлов-ресурсов, чтоб он потом в визуалстудии скомпилировался, а хочется типа щас а не потом.

Я в рестораторе (Restorator) создавал файлы ресурсов, в Дельфи без проблем все подключалось. А Студии и свой отличный редактор есть - пользовался им еще когда винда 95 только появилась.
Автор: Garrett
Дата сообщения: 01.07.2011 07:21
HNKTO
Возьми у меня с сайта последнее издание Петцольда с примерами - http://alexsoft.home.nov.ru/prog/index.htm ...
Автор: user_MAN09
Дата сообщения: 24.07.2011 22:02
в локалке на одном компе есть инет
как на С++ написать простой (без логов, пасов, и т.п.)
прокси сервер для раздачи инета на другой комп в локалке
может полезные ссылки,
или подскажите принцип работы прокси сервака для данного случая
для самостоятельного написания кода

спасибо за внимание
Автор: V0lt
Дата сообщения: 29.07.2011 16:24
В Windows есть настройка языка и региональных стандартов. Если, к примеру, там выбрать португальский язык, то в поле "Полная дата" появиться дата на португальском. Это можно использовать в своей программе? Т.е. требуется выводить дату на конкретном языке вне зависимости от того, что настроено в системе.
Автор: Abs62
Дата сообщения: 29.07.2011 16:55
Для этого системные настройки трогать не требутся. Просто бери функцию GetDateFormat (или GetDateFormatEx) и выводи в нужном формате и на нужном языке.
Автор: Molniev
Дата сообщения: 29.07.2011 16:55
Легко и просто. Используйте стандартную функцию GetDateFormat, только для параметра Locale сформируйте макросом MAKELCID идентификатор локали - и винда честным образом отформатирует переданую третьим параметром дату как вам нужно, на конкретном языке и даже его диалекте.

PS. Пока писал успели ответить выше.
Автор: V0lt
Дата сообщения: 29.07.2011 17:09
Abs62, Molniev
Спасибо! А есть похожее для размера файла (нужно аббревиатуры для килобайтов, мегабайтов переводить)? А то StrFormatByteSizeW выдает на текущем языке, а нужно на указанном в настройках программы.

Автор: judelaw
Дата сообщения: 07.08.2011 23:05
Подскажите пожалуйста.
В программировании не силен, но хочу в коде мрс-нс модифицировать класс CPlayerListCtrl, чтоб внедрить помимо существующих в нем CEdit, CComboBox, CListBox еще и СHotKey контрол. Возможно ли вообще такое провернуть?

Делаю примерно как и для CEdit класса, прописывая класс CHotKeyCtrl - при компиляции имею типа такого:
PlayerListCtrl.obj : error LNK2019: unresolved external symbol "public: __thiscall CInPlaceHotKey::CInPlaceHotKey(int,int)" (??0CInPlaceHotKey@@QAE@HH@Z) referenced in function "public: class CHotKeyCtrl * __thiscall CPlayerListCtrl::ShowInPlaceHotKey(int,int)" (?ShowInPlaceHotKey@CPlayerListCtrl@@QAEPAVCHotKeyCtrl@@HH@Z)

Смысл всего этого: хочу переделать назначение горячих клавиш в плеере, заменив комбобокс с выбором готовых неудобных значений из списка, на контрол HotKey в таблице, чтоб легко и удобно для пользователя было горячие клавиатурные сочетания назначать.

Спасибо.
Автор: Abs62
Дата сообщения: 07.08.2011 23:19
judelaw

Цитата:
Делаю примерно как и для CEdit класса, прописывая класс CHotKeyCtrl - при компиляции имею типа такого

Код смотреть надо. Судя по сообщениям линкера, не реализован конструктор класса CInPlaceHotKey с двумя целыми в качестве параметров.
Автор: judelaw
Дата сообщения: 07.08.2011 23:56
Abs62
Спасибо!!! Подправил, получилось.
Только осталось как то значения научить сохранять в этом поле ....
Автор: ItsJustMe
Дата сообщения: 08.08.2011 00:03
judelaw
О-оооо! MPC-HC. Ты его для начала просто собери, без собственных модификаций. Получишь массу удовольствия. А как такое счастиё настанет - так и поробуй там что-то менять.
PS: А, так ты уже... Ну тогда снимаю шляпу перед очередным разгребателем авгиевых конюшен.
Автор: judelaw
Дата сообщения: 08.08.2011 00:06
ItsJustMe
А чего его собирать? Плевое дело, раз 200 уже собирал и собираю.
Автор: ItsJustMe
Дата сообщения: 08.08.2011 00:07
offtopic starts
Молодец! А мне вот разгребать надоело....
offtopic ends
Автор: judelaw
Дата сообщения: 08.08.2011 00:08
Так-с, а как мне теперь строку из это контрола выдрать??? Не сохраняет значение при выходе из поля
то есть в:
CPPageAccelTbl::OnEndlabeleditList
------------
case COL_KEY: {
    CString str = pItem->pszText;
    m_list.SetItemText(pItem->iItem, pItem->iSubItem, str);
    *pResult = TRUE;
}
не фурычит. Я так понимаю нужно типа строковую GetHotKeyName заполучить, а как к этому элементу обратиться?? Если бы не в составе CPlayerListCtrl то легко, а так...
Автор: judelaw
Дата сообщения: 08.08.2011 10:18
С этим тоже разобрался. Осталось событие на Escape как то придумать, чтоб оставалось значение в поле до редактирования (а то в пусто сбрасывает при Esc)
-----------------------
Ерунда это все, надо попробовать CWinHotKeyCtrl прилепить.
Всем спасибо!
Автор: ShIvADeSt
Дата сообщения: 08.08.2011 13:23
judelaw
Разработку и модификацию МРС наверное в другой теме. Так как трабла не в том, как сделать конкретную вещь (это то понятно), а куда это прилепить в исходниках.
Автор: V0lt
Дата сообщения: 08.08.2011 13:55
ItsJustMe

Цитата:
О-оооо! MPC-HC. Ты его для начала просто собери, без собственных модификаций. Получишь массу удовольствия.

Уже довольно долгое время сабж собирается по официальной инструкции с первого раза. Раньше да, была жопа.

judelaw

Цитата:
С этим тоже разобрался.

Выложи куда-нибудь модифицированные PlayerListCtrl.h/PlayerListCtrl.cpp, чтобы потом не искать.
Автор: V0lt
Дата сообщения: 09.08.2011 23:11
Есть слайдер.

Код: CSliderCtrl slider;

slider.SetRange(-100, 100);
slider.SetPos(0);
Автор: ShIvADeSt
Дата сообщения: 10.08.2011 03:30
V0lt

Цитата:
slider.SetRange(-100, 100);
slider.SetPos(0);

Потому что в данном случае есть всего две позиции -100 и 100. Поэтому SetPos(0) указывает на левую позицию. Попробуй сделать

Цитата:
slider.SetRange(-100, 100);
slider.SetTicFreq(100);
slider.SetPos(0);

По идее будет всего один тик в нуле и там же будет курсор.
Автор: V0lt
Дата сообщения: 10.08.2011 07:56
ShIvADeSt
Такой способ не совсем годиться. Диапазоны у меня разные.

Причина бага в том, что по умолчанию позиция равна 0 и диапазон 0...100, и после SetRange(-100, 100) слайдер должен был перерисоваться, но этого не произошло. Затем при вызове SetPos(0) метод слайдера видит, что позиция не менялась и как бы естественно ничего не перерисовывает.
А вот метод SetTicFreq, принудительно вызывает перерисовку и поэтому после него все хорошо. Но он мне не нужен, я использую SetTic, который перерисовывает только себя и ползунок не двигает.

Вот способ решения проблемы

Код: slider.SetRange(-100, 100);
slider.SetPos(1);
slider.SetPos(0);
Автор: kok80
Дата сообщения: 03.10.2011 14:06
Вопрос не про C++, но про WINAPI:

копирую из броузера на удаленном компе текст в буфер обмена, пытаюсь его програмно прочитать на своем компе: вместо русских букв вопросики: GetClipboardData(CF_TEXT) или CF_OEMTEXT или CF_UNICODETEXT результат один. Открываю notepad/excel, в них текст вставляется нормально русскими буквами. При копировании с этого же сайта на локальном компе все ок. То ли notepad с другие проги его конвертируют, то ли я какой-то формат Clipboarda упустил ?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.