» C++ WinAPI
V0lt
Я тоже когда-то над этим вопросом думал Файл может не писаться по сотне разных причин, лишь одна из которых ACL. Причем даже если ты проверишь сейчас, не факт что через секунду ничего не поменяется (race condition). Ну диск например заполнился...
Потому нужно просто писать то, что ты там инсталлируешь, и внятно сообшить об ошибке, если она произойдет. Код ошибки и текстовое сообщение от WinAPI всегда можно получить.
Цитата:
пусть тот, кто его установил, сам и удаляет
Я тоже когда-то над этим вопросом думал Файл может не писаться по сотне разных причин, лишь одна из которых ACL. Причем даже если ты проверишь сейчас, не факт что через секунду ничего не поменяется (race condition). Ну диск например заполнился...
Потому нужно просто писать то, что ты там инсталлируешь, и внятно сообшить об ошибке, если она произойдет. Код ошибки и текстовое сообщение от WinAPI всегда можно получить.
Цитата:
Существует же отдельное право на удаление.
пусть тот, кто его установил, сам и удаляет
Приветствую всех!
Не так давно занимаюсь программирование VS C++, очень заинтересовал подход чистого WinAPI. Хочется разобраться в тонкостях сего. WinAPI - это набор функций, типов данных, сообщений ОС Windows. Работать с ними достаточно удобно.
Стандартная функция типа: int MessageBox ( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) понятна, в MSDN все доступно описано как с ней работать. И вот вопрос: а исходный код функций WinAPI, стандартных контролов таких как Button, ComboBox, сообщений и др. доступен ?
Не так давно занимаюсь программирование VS C++, очень заинтересовал подход чистого WinAPI. Хочется разобраться в тонкостях сего. WinAPI - это набор функций, типов данных, сообщений ОС Windows. Работать с ними достаточно удобно.
Стандартная функция типа: int MessageBox ( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) понятна, в MSDN все доступно описано как с ней работать. И вот вопрос: а исходный код функций WinAPI, стандартных контролов таких как Button, ComboBox, сообщений и др. доступен ?
Al_Lie
Нет конечно, ну вы можете попробовать глянуть утекшие сорцы Win2k и NT4, но не более того
Нет конечно, ну вы можете попробовать глянуть утекшие сорцы Win2k и NT4, но не более того
Al_Lie
официально - нет, но можно воспользоваться одним из следующих способов:
1. дизассемблированием интересующей тебя функции
2. исходники wine
3. исходники reactos
4. часть исходников win2k, которые гуляют по сети
официально - нет, но можно воспользоваться одним из следующих способов:
1. дизассемблированием интересующей тебя функции
2. исходники wine
3. исходники reactos
4. часть исходников win2k, которые гуляют по сети
Исходники видимо лежат у Билла Гейтса дома.))) Спасибо за коменты.
Помогите пожалуйста новичку.
Первая программа, естественно Hello world!
Код из книги Щупака "Win32 API. Эффективная разработка приложений" .
Код: #include <windows.h>
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nShowCmd)
{
MessageBox (NULL, "Hello, WinWorld32!", "Hello from messagebox", MB_OK);
return 0;
}
Первая программа, естественно Hello world!
Код из книги Щупака "Win32 API. Эффективная разработка приложений" .
Код: #include <windows.h>
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nShowCmd)
{
MessageBox (NULL, "Hello, WinWorld32!", "Hello from messagebox", MB_OK);
return 0;
}
Andrey32
Цитата:
Угу. Компилируется юникодная версия программы, а параметры задаются CHAR вместо WCHAR.
Код: MessageBox (NULL, L"Hello, WinWorld32!", L"Hello from messagebox", MB_OK);
Цитата:
При компиляции выдает ошибку, что:
Угу. Компилируется юникодная версия программы, а параметры задаются CHAR вместо WCHAR.
Код: MessageBox (NULL, L"Hello, WinWorld32!", L"Hello from messagebox", MB_OK);
Цитата:
Это не тот MessageBox, это метод интерфейса IConsole2
Да я понял, что это какой то метод, только почему то это та инфа , которая вывалилась по F1 c курсором на MessageBox.
Цитата:
Угу. Компилируется юникодная версия программы, а параметры задаются CHAR вместо WCHAR.
О! Спасибо. Просто я до этого писал только для консоли, с ASC.
Включил в свойствах проекта Character Set -> Not set. Теперь можно писать без L.
Andrey32, используйте макроподстановку TEXT("строковый литерал"). Тогда в Вашей программе автоматически будет подставляться правильное представление символьных строк в функции API.
Цитата:
Andrey32, используйте макроподстановку TEXT("строковый литерал"). Тогда в Вашей программе автоматически будет подставляться правильное представление символьных строк в функции API.
Не очень понял с макроподстановкой. Можно пример кода?
Andrey32
Код: MessageBox (NULL, _TEXT("Hello, WinWorld32!"), _TEXT("Hello from messagebox"), MB_OK);
Код: MessageBox (NULL, _TEXT("Hello, WinWorld32!"), _TEXT("Hello from messagebox"), MB_OK);
Помогите с проблемой...
Не могу разобраться с кнопкой. Надо отловить от нее сообщение о нажатии и отжатии. Пробывал ставить кнопке стиль BS_NOTIFY и отлавливать в WM_COMMAND сообщения HIWORD(wParam) == BN_PUSHED или BN_UNPUSHED, но ни какого эффекта, не приходят эти сообщения
Объясните почему и как решить мою задачу.
Заранее благодарен за ответы!!!
Не могу разобраться с кнопкой. Надо отловить от нее сообщение о нажатии и отжатии. Пробывал ставить кнопке стиль BS_NOTIFY и отлавливать в WM_COMMAND сообщения HIWORD(wParam) == BN_PUSHED или BN_UNPUSHED, но ни какого эффекта, не приходят эти сообщения
Объясните почему и как решить мою задачу.
Заранее благодарен за ответы!!!
peacedeth
Цитата:
Потому, что:
Цитата:
Цитата:
Зависит от задачи. Можно через BS_OWNERDRAW, но тогда кнопку придётся рисовать самому. Или можно написать свой обработчик событий для кнопки и ловить в нём WM_LBUTTONDOWN, WM_LBUTTONUP.
Цитата:
Объясните почему
Потому, что:
Цитата:
Note: This notification message is provided only for compatibility with 16-bit versions of Microsoft Windows earlier than version 3.0. Applications should use the BS_OWNERDRAW button style and the DRAWITEMSTRUCT structure for this task.
Цитата:
и как решить мою задачу.
Зависит от задачи. Можно через BS_OWNERDRAW, но тогда кнопку придётся рисовать самому. Или можно написать свой обработчик событий для кнопки и ловить в нём WM_LBUTTONDOWN, WM_LBUTTONUP.
я и BS_OWNERDRAW кнопку создавал, нотификационные сообщения все равно не приходят. Можно конечно по событиям в WM_DRAWITEM отследить что произошло, но мне кажется это как то криво, хотелось бы именно получать BN_PUSHED/UNPUSHED.
А как написать свой обработчик? Киньте примерчик или описание, или ссылку в МСДН.
А как написать свой обработчик? Киньте примерчик или описание, или ссылку в МСДН.
peacedeth
Обработчик - это по сути та же самая оконная функция. Почитать, как она подключается к уже существующему окну (а кнопка - это тоже окно) можно здесь, например, раздел "Instance Subclassing". Там показано на примере Edit control, но для Button принцип тот же.
Обработчик - это по сути та же самая оконная функция. Почитать, как она подключается к уже существующему окну (а кнопка - это тоже окно) можно здесь, например, раздел "Instance Subclassing". Там показано на примере Edit control, но для Button принцип тот же.
Спасибо Abs62!
Буду учиться.
Буду учиться.
peacedeth
Цитата:
Через SetWindowLong ставить собственную оконную функцию на кнопку и мониторить WM_LBUTTONDOWN WM_LBUTTONUP.
Однако проблема в том, что эти события приходят не зависимо - то есть не факт что каждому дауну будет соотв ап.
Вопрос - в след, нафига ловить событие нажатия и отжатия?
Цитата:
Не могу разобраться с кнопкой. Надо отловить от нее сообщение о нажатии и отжатии. Пробывал ставить кнопке стиль BS_NOTIFY
Через SetWindowLong ставить собственную оконную функцию на кнопку и мониторить WM_LBUTTONDOWN WM_LBUTTONUP.
Однако проблема в том, что эти события приходят не зависимо - то есть не факт что каждому дауну будет соотв ап.
Вопрос - в след, нафига ловить событие нажатия и отжатия?
Надо сделать так что бы при удержании кнопки нажатой непрерывно выполнялось какое то действие до момента отпускания этой кнопки.
Я попробовал через SetWindowLong сделать функцию, вроде работает. Ловит WM_LBUTTONDOWN WM_LBUTTONUP именно над кнопкой.
А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?
Еще такой вопрос, у меня много кнопок которые нужно так контролировать. Мне вручную для каждой кнопки указывать свой обработчик сообщений или можно как то это автоматизировать, например создать свой класс или новый контрол?
Я попробовал через SetWindowLong сделать функцию, вроде работает. Ловит WM_LBUTTONDOWN WM_LBUTTONUP именно над кнопкой.
А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?
Еще такой вопрос, у меня много кнопок которые нужно так контролировать. Мне вручную для каждой кнопки указывать свой обработчик сообщений или можно как то это автоматизировать, например создать свой класс или новый контрол?
peacedeth
Цитата:
ИМХО ерунда, правда это можно попробовать сделать через WM_DRAWITEM у кнопки при отрисовки смотреть нажата она или нет и делать событие, но тут наверное лучше создавать поток (чтобы не стопорить отрисовку) и смотреть, если поток не запущен, то запустить иначе ничего не делать, а если стиль стал кнопка отпущена - то убить поток.
Цитата:
Это значит, что я могу нажать кнопку мыши за пределами баттона, потом навести ее на баттон и отпустить, ты получишь только событие баттонап, аналогично нажимаю мышь на баттоне, увожу ее за пределы баттона - отпускаю, событие баттонап ты не получишь.
Цитата:
Да, иначе достаточно геморрно все это отслеживать. В принципе тут есть пользовател Maks(не помню цифры) он маньячится по сабклассингу, при этом очень красиво реализует. Так вот он через указатели хранит нужные данные у самого контрола. НО ИМХО собственный класс удобнее.
Цитата:
Надо сделать так что бы при удержании кнопки нажатой непрерывно выполнялось какое то действие до момента отпускания этой кнопки.
ИМХО ерунда, правда это можно попробовать сделать через WM_DRAWITEM у кнопки при отрисовки смотреть нажата она или нет и делать событие, но тут наверное лучше создавать поток (чтобы не стопорить отрисовку) и смотреть, если поток не запущен, то запустить иначе ничего не делать, а если стиль стал кнопка отпущена - то убить поток.
Цитата:
А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?
Это значит, что я могу нажать кнопку мыши за пределами баттона, потом навести ее на баттон и отпустить, ты получишь только событие баттонап, аналогично нажимаю мышь на баттоне, увожу ее за пределы баттона - отпускаю, событие баттонап ты не получишь.
Цитата:
Еще такой вопрос, у меня много кнопок которые нужно так контролировать. Мне вручную для каждой кнопки указывать свой обработчик сообщений или можно как то это автоматизировать, например создать свой класс или новый контрол?
Да, иначе достаточно геморрно все это отслеживать. В принципе тут есть пользовател Maks(не помню цифры) он маньячится по сабклассингу, при этом очень красиво реализует. Так вот он через указатели хранит нужные данные у самого контрола. НО ИМХО собственный класс удобнее.
ShIvADeSt
С WM_DRAWITEM не удобно. приходится кнопку отрисовывать всегда, а мне не нужна видоизменять кнопку, надо только событие нажатия/отжатия ловить. И почему все таки не получается использовать BN_PUSHED/UNPUSHED?
С WM_DRAWITEM не удобно. приходится кнопку отрисовывать всегда, а мне не нужна видоизменять кнопку, надо только событие нажатия/отжатия ловить. И почему все таки не получается использовать BN_PUSHED/UNPUSHED?
peacedeth
Цитата:
А MS и не обещала, что они будут работать в 32-разрядных программах. Я же приводил цитату из MSDN про "only for compatibility with 16-bit versions of Microsoft Windows".
Цитата:
И почему все таки не получается использовать BN_PUSHED/UNPUSHED?
А MS и не обещала, что они будут работать в 32-разрядных программах. Я же приводил цитату из MSDN про "only for compatibility with 16-bit versions of Microsoft Windows".
Abs62
Вот MS удоты!!!
Тогда такой вопрос: а можно сделать так что бы с использованием BS_OWNERDRAW, в WM_DRAWITEM не рисавать свою кнопку а каким то образом вызывать стандартную картинку для данного действия, что бы как можно больше упростить данную процедуру?
Вот MS удоты!!!
Тогда такой вопрос: а можно сделать так что бы с использованием BS_OWNERDRAW, в WM_DRAWITEM не рисавать свою кнопку а каким то образом вызывать стандартную картинку для данного действия, что бы как можно больше упростить данную процедуру?
peacedeth
DrawThemeBackground(ButtonTheme, MyHdc, BP_PUSHBUTTON, NewStylte, MyRect, nil);
либо
DrawFrameControl(MyHdc, MyRect, DFC_BUTTON, OldStylte);
в зависимости манифест используется или нет.
Просто сама по себе идея выполнять что то пока нажата кнопка не удачная, так как по хорошему при этом происходит блокировка отправки след событий, что чревато.
И еще - сколько я уже программлю, ни разу не встречал подобных условий задачи.
DrawThemeBackground(ButtonTheme, MyHdc, BP_PUSHBUTTON, NewStylte, MyRect, nil);
либо
DrawFrameControl(MyHdc, MyRect, DFC_BUTTON, OldStylte);
в зависимости манифест используется или нет.
Просто сама по себе идея выполнять что то пока нажата кнопка не удачная, так как по хорошему при этом происходит блокировка отправки след событий, что чревато.
И еще - сколько я уже программлю, ни разу не встречал подобных условий задачи.
ShIvADeSt
Открою карты, мне нужны эти события для коммуникационной программы управления внешними приводами (эл. двигатели) через COM порт. А смысл в том что пока держишь кнопку сигнал поступает и двигатель работает, отпустил кнопку - стоп.
Если есть идеи как реализовать замысел, я с удовольствием выслушаю.
Открою карты, мне нужны эти события для коммуникационной программы управления внешними приводами (эл. двигатели) через COM порт. А смысл в том что пока держишь кнопку сигнал поступает и двигатель работает, отпустил кнопку - стоп.
Если есть идеи как реализовать замысел, я с удовольствием выслушаю.
peacedeth
Ну тады единственно правильный вариант, чтобы не было проблем.
Делаешь сабклассинг кнопки (обойдемся без BS_OWNERDRAW). Ставишь обработчик на WM_LBUTTONDOWN (Up нам не нужен, почему будет ясно дальше). В обработчике запускаешь свой код (мой совет, создавай поток, это самое грамотное решение).
В основной оконной функции ловишь WM_COMMAND с айдишником своей кнопки (это означает, что кнопку нажали и отпустили). В этом событии делаешь TerminateThread потоку.
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
Хотя в принципе можно и это отловить через SetCapture ReleaseCapture. Если понадобится код дам.
Ну тады единственно правильный вариант, чтобы не было проблем.
Делаешь сабклассинг кнопки (обойдемся без BS_OWNERDRAW). Ставишь обработчик на WM_LBUTTONDOWN (Up нам не нужен, почему будет ясно дальше). В обработчике запускаешь свой код (мой совет, создавай поток, это самое грамотное решение).
В основной оконной функции ловишь WM_COMMAND с айдишником своей кнопки (это означает, что кнопку нажали и отпустили). В этом событии делаешь TerminateThread потоку.
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
Хотя в принципе можно и это отловить через SetCapture ReleaseCapture. Если понадобится код дам.
peacedeth
Может я ошибаюсь (уже давно напрямую с API не работаю), но если вдруг пользователю вашей программы придёт в голову нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт, и двигатель будет продолжать работать. На button down надо сделать capture mouse, кажется, и ловить отпускание кнопки. Надеюсь, ShIvADeSt меня поправит, если я не прав.
PS. Я ещё и читал невнимательно, это уже обсуждалось...
Может я ошибаюсь (уже давно напрямую с API не работаю), но если вдруг пользователю вашей программы придёт в голову нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт, и двигатель будет продолжать работать. На button down надо сделать capture mouse, кажется, и ловить отпускание кнопки. Надеюсь, ShIvADeSt меня поправит, если я не прав.
PS. Я ещё и читал невнимательно, это уже обсуждалось...
ShIvADeSt
Я примерно так же и думал отлавливать отжатие...
Я вот думаю, а стоит ли создавать поток? В принципе никаких других действий, кроме как циклической посылки пакетов в компорт, производиться не будет. А сама по себе работа с компортом ведется в асинхронном режиме, там и так свой поток...
xterm
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.
Я примерно так же и думал отлавливать отжатие...
Я вот думаю, а стоит ли создавать поток? В принципе никаких других действий, кроме как циклической посылки пакетов в компорт, производиться не будет. А сама по себе работа с компортом ведется в асинхронном режиме, там и так свой поток...
xterm
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.
peacedeth
Цитата:
не совсем так, если сделать вот так
Цитата:
то события BN_CLICKED не будет (я про это писал
Цитата:
то есть если просто нажать и потом отпустить, то все ок. Иначе Set (Release) Capture.
Если подобные случаи возможны, то дам код.
Цитата:
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.
не совсем так, если сделать вот так
Цитата:
нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт
то события BN_CLICKED не будет (я про это писал
Цитата:
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.)
то есть если просто нажать и потом отпустить, то все ок. Иначе Set (Release) Capture.
Если подобные случаи возможны, то дам код.
Цитата:
В этом событии делаешь TerminateThread потоку.Мда... Более вредного совета на примете нет?
Страницы: 12345678910111213141516171819202122232425262728293031323334353637
Предыдущая тема: посоветуйте книги по SQL
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.