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

» C++ WinAPI

Автор: koderr
Дата сообщения: 21.08.2009 14:34
Grey2009
glGetString( GL_EXTENSIONS )
алсо линк.
Автор: dmka
Дата сообщения: 21.08.2009 14:45
V0lt
Я тоже когда-то над этим вопросом думал Файл может не писаться по сотне разных причин, лишь одна из которых ACL. Причем даже если ты проверишь сейчас, не факт что через секунду ничего не поменяется (race condition). Ну диск например заполнился...

Потому нужно просто писать то, что ты там инсталлируешь, и внятно сообшить об ошибке, если она произойдет. Код ошибки и текстовое сообщение от WinAPI всегда можно получить.


Цитата:
Существует же отдельное право на удаление.

пусть тот, кто его установил, сам и удаляет
Автор: Al_Lie
Дата сообщения: 16.09.2009 11:56
Приветствую всех!
Не так давно занимаюсь программирование VS C++, очень заинтересовал подход чистого WinAPI. Хочется разобраться в тонкостях сего. WinAPI - это набор функций, типов данных, сообщений ОС Windows. Работать с ними достаточно удобно.
Стандартная функция типа: int MessageBox ( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) понятна, в MSDN все доступно описано как с ней работать. И вот вопрос: а исходный код функций WinAPI, стандартных контролов таких как Button, ComboBox, сообщений и др. доступен ?
Автор: Hiken
Дата сообщения: 16.09.2009 12:23
Al_Lie
Нет конечно, ну вы можете попробовать глянуть утекшие сорцы Win2k и NT4, но не более того
Автор: Lyrik
Дата сообщения: 16.09.2009 12:24
Al_Lie
официально - нет, но можно воспользоваться одним из следующих способов:
1. дизассемблированием интересующей тебя функции
2. исходники wine
3. исходники reactos
4. часть исходников win2k, которые гуляют по сети
Автор: Al_Lie
Дата сообщения: 16.09.2009 18:59
Исходники видимо лежат у Билла Гейтса дома.))) Спасибо за коменты.
Автор: Andrey32
Дата сообщения: 04.10.2009 22:16
Помогите пожалуйста новичку.
Первая программа, естественно 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;
}
Автор: Abs62
Дата сообщения: 04.10.2009 22:42
Andrey32

Цитата:
При компиляции выдает ошибку, что:

Угу. Компилируется юникодная версия программы, а параметры задаются CHAR вместо WCHAR.

Код: MessageBox (NULL, L"Hello, WinWorld32!", L"Hello from messagebox", MB_OK);
Автор: Andrey32
Дата сообщения: 04.10.2009 23:16

Цитата:
Это не тот MessageBox, это метод интерфейса IConsole2

Да я понял, что это какой то метод, только почему то это та инфа , которая вывалилась по F1 c курсором на MessageBox.


Цитата:
Угу. Компилируется юникодная версия программы, а параметры задаются CHAR вместо WCHAR.

О! Спасибо. Просто я до этого писал только для консоли, с ASC.
Включил в свойствах проекта Character Set -> Not set. Теперь можно писать без L.
Автор: karakurt2
Дата сообщения: 05.10.2009 19:36
Andrey32, используйте макроподстановку TEXT("строковый литерал"). Тогда в Вашей программе автоматически будет подставляться правильное представление символьных строк в функции API.
Автор: Andrey32
Дата сообщения: 07.10.2009 23:29

Цитата:
Andrey32, используйте макроподстановку TEXT("строковый литерал"). Тогда в Вашей программе автоматически будет подставляться правильное представление символьных строк в функции API.


Не очень понял с макроподстановкой. Можно пример кода?
Автор: Abs62
Дата сообщения: 07.10.2009 23:46
Andrey32

Код: MessageBox (NULL, _TEXT("Hello, WinWorld32!"), _TEXT("Hello from messagebox"), MB_OK);
Автор: peacedeth
Дата сообщения: 11.10.2009 15:24
Помогите с проблемой...

Не могу разобраться с кнопкой. Надо отловить от нее сообщение о нажатии и отжатии. Пробывал ставить кнопке стиль BS_NOTIFY и отлавливать в WM_COMMAND сообщения HIWORD(wParam) == BN_PUSHED или BN_UNPUSHED, но ни какого эффекта, не приходят эти сообщения
Объясните почему и как решить мою задачу.

Заранее благодарен за ответы!!!
Автор: Abs62
Дата сообщения: 11.10.2009 17:25
peacedeth

Цитата:
Объясните почему

Потому, что:

Цитата:
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.
Автор: peacedeth
Дата сообщения: 11.10.2009 19:15
я и BS_OWNERDRAW кнопку создавал, нотификационные сообщения все равно не приходят. Можно конечно по событиям в WM_DRAWITEM отследить что произошло, но мне кажется это как то криво, хотелось бы именно получать BN_PUSHED/UNPUSHED.

А как написать свой обработчик? Киньте примерчик или описание, или ссылку в МСДН.
Автор: Abs62
Дата сообщения: 11.10.2009 19:39
peacedeth
Обработчик - это по сути та же самая оконная функция. Почитать, как она подключается к уже существующему окну (а кнопка - это тоже окно) можно здесь, например, раздел "Instance Subclassing". Там показано на примере Edit control, но для Button принцип тот же.
Автор: peacedeth
Дата сообщения: 11.10.2009 23:16
Спасибо Abs62!
Буду учиться.
Автор: ShIvADeSt
Дата сообщения: 12.10.2009 01:38
peacedeth

Цитата:
Не могу разобраться с кнопкой. Надо отловить от нее сообщение о нажатии и отжатии. Пробывал ставить кнопке стиль BS_NOTIFY

Через SetWindowLong ставить собственную оконную функцию на кнопку и мониторить WM_LBUTTONDOWN WM_LBUTTONUP.
Однако проблема в том, что эти события приходят не зависимо - то есть не факт что каждому дауну будет соотв ап.
Вопрос - в след, нафига ловить событие нажатия и отжатия?
Автор: peacedeth
Дата сообщения: 12.10.2009 03:45
Надо сделать так что бы при удержании кнопки нажатой непрерывно выполнялось какое то действие до момента отпускания этой кнопки.

Я попробовал через SetWindowLong сделать функцию, вроде работает. Ловит WM_LBUTTONDOWN WM_LBUTTONUP именно над кнопкой.

А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?

Еще такой вопрос, у меня много кнопок которые нужно так контролировать. Мне вручную для каждой кнопки указывать свой обработчик сообщений или можно как то это автоматизировать, например создать свой класс или новый контрол?
Автор: ShIvADeSt
Дата сообщения: 12.10.2009 04:17
peacedeth

Цитата:
Надо сделать так что бы при удержании кнопки нажатой непрерывно выполнялось какое то действие до момента отпускания этой кнопки.

ИМХО ерунда, правда это можно попробовать сделать через WM_DRAWITEM у кнопки при отрисовки смотреть нажата она или нет и делать событие, но тут наверное лучше создавать поток (чтобы не стопорить отрисовку) и смотреть, если поток не запущен, то запустить иначе ничего не делать, а если стиль стал кнопка отпущена - то убить поток.

Цитата:
А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?

Это значит, что я могу нажать кнопку мыши за пределами баттона, потом навести ее на баттон и отпустить, ты получишь только событие баттонап, аналогично нажимаю мышь на баттоне, увожу ее за пределы баттона - отпускаю, событие баттонап ты не получишь.

Цитата:
Еще такой вопрос, у меня много кнопок которые нужно так контролировать. Мне вручную для каждой кнопки указывать свой обработчик сообщений или можно как то это автоматизировать, например создать свой класс или новый контрол?

Да, иначе достаточно геморрно все это отслеживать. В принципе тут есть пользовател Maks(не помню цифры) он маньячится по сабклассингу, при этом очень красиво реализует. Так вот он через указатели хранит нужные данные у самого контрола. НО ИМХО собственный класс удобнее.
Автор: peacedeth
Дата сообщения: 12.10.2009 10:28
ShIvADeSt

С WM_DRAWITEM не удобно. приходится кнопку отрисовывать всегда, а мне не нужна видоизменять кнопку, надо только событие нажатия/отжатия ловить. И почему все таки не получается использовать BN_PUSHED/UNPUSHED?
Автор: Abs62
Дата сообщения: 12.10.2009 15:58
peacedeth

Цитата:
И почему все таки не получается использовать BN_PUSHED/UNPUSHED?

А MS и не обещала, что они будут работать в 32-разрядных программах. Я же приводил цитату из MSDN про "only for compatibility with 16-bit versions of Microsoft Windows".

Автор: peacedeth
Дата сообщения: 12.10.2009 22:27
Abs62

Вот MS удоты!!!

Тогда такой вопрос: а можно сделать так что бы с использованием BS_OWNERDRAW, в WM_DRAWITEM не рисавать свою кнопку а каким то образом вызывать стандартную картинку для данного действия, что бы как можно больше упростить данную процедуру?
Автор: ShIvADeSt
Дата сообщения: 13.10.2009 01:09
peacedeth
DrawThemeBackground(ButtonTheme, MyHdc, BP_PUSHBUTTON, NewStylte, MyRect, nil);
либо
DrawFrameControl(MyHdc, MyRect, DFC_BUTTON, OldStylte);
в зависимости манифест используется или нет.

Просто сама по себе идея выполнять что то пока нажата кнопка не удачная, так как по хорошему при этом происходит блокировка отправки след событий, что чревато.
И еще - сколько я уже программлю, ни разу не встречал подобных условий задачи.

Автор: peacedeth
Дата сообщения: 13.10.2009 02:02
ShIvADeSt

Открою карты, мне нужны эти события для коммуникационной программы управления внешними приводами (эл. двигатели) через COM порт. А смысл в том что пока держишь кнопку сигнал поступает и двигатель работает, отпустил кнопку - стоп.
Если есть идеи как реализовать замысел, я с удовольствием выслушаю.
Автор: ShIvADeSt
Дата сообщения: 13.10.2009 02:29
peacedeth
Ну тады единственно правильный вариант, чтобы не было проблем.
Делаешь сабклассинг кнопки (обойдемся без BS_OWNERDRAW). Ставишь обработчик на WM_LBUTTONDOWN (Up нам не нужен, почему будет ясно дальше). В обработчике запускаешь свой код (мой совет, создавай поток, это самое грамотное решение).
В основной оконной функции ловишь WM_COMMAND с айдишником своей кнопки (это означает, что кнопку нажали и отпустили). В этом событии делаешь TerminateThread потоку.
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
Хотя в принципе можно и это отловить через SetCapture ReleaseCapture. Если понадобится код дам.
Автор: xterm
Дата сообщения: 13.10.2009 03:51
peacedeth
Может я ошибаюсь (уже давно напрямую с API не работаю), но если вдруг пользователю вашей программы придёт в голову нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт, и двигатель будет продолжать работать. На button down надо сделать capture mouse, кажется, и ловить отпускание кнопки. Надеюсь, ShIvADeSt меня поправит, если я не прав.

PS. Я ещё и читал невнимательно, это уже обсуждалось...
Автор: peacedeth
Дата сообщения: 13.10.2009 04:03
ShIvADeSt

Я примерно так же и думал отлавливать отжатие...
Я вот думаю, а стоит ли создавать поток? В принципе никаких других действий, кроме как циклической посылки пакетов в компорт, производиться не будет. А сама по себе работа с компортом ведется в асинхронном режиме, там и так свой поток...

xterm

Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.
Автор: ShIvADeSt
Дата сообщения: 13.10.2009 04:19
peacedeth

Цитата:
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.

не совсем так, если сделать вот так

Цитата:
нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт

то события BN_CLICKED не будет (я про это писал
Цитата:
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
)
то есть если просто нажать и потом отпустить, то все ок. Иначе Set (Release) Capture.
Если подобные случаи возможны, то дам код.
Автор: Qraizer
Дата сообщения: 13.10.2009 07:37

Цитата:
В этом событии делаешь TerminateThread потоку.
Мда... Более вредного совета на примете нет?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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