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

» C++ WinAPI

Автор: DeADMoHAX
Дата сообщения: 25.09.2006 07:58
xdude
бывает... вон у меня всю жизнь винсокет работал, а потом раз и целый день работатть отказывался.... потом заработал..
Автор: vshersh
Дата сообщения: 26.09.2006 10:51
Hi All!
Предположим что некоторый файл занят другим процессом.

Цитата:
When a process attempts to open a file that has already been opened in sharing mode, the system compares the requested access and sharing modes to those specified when the file was opened. If you specify an access mode that conflicts with the sharing mode specified in the previous open call, CreateFile fails with a sharing violation (ERROR_SHARING_VIOLATION). If you specify a sharing mode that conflicts with the access mode specified in the previous open call, CreateFile fails with a sharing violation.

Как определить какой процесс держит конкретный файл?
Автор: TeXpert
Дата сообщения: 27.09.2006 04:49
vshersh

Цитата:
Как определить какой процесс держит конкретный файл?

Методом научного тыка).
А так, используй утилиты от Руссиновича (sysinternals.com?): Filemon (динамический) и Process Explorer (статический) показ интересующей тебя информации.
Автор: FireZone
Дата сообщения: 27.09.2006 08:56
vshersh
Посмотри тут. Есть примеры кода, из них можно сообразить.
Автор: DeADMoHAX
Дата сообщения: 29.09.2006 17:13
Как бороться с такой ошибкой при вызове winsock функции sendto -

Цитата:
WSAEINTR 10004
Interrupted function call.
A blocking operation was interrupted by a call to WSACancelBlockingCall.
?

Добавлено:
Функции WSACancelBlockingCall не вызывал я.
Автор: Thritt
Дата сообщения: 08.10.2006 10:07
У меня такой вопрос: как в WinAPI на С++ создать второе окно (диалог) не используя файл ресурсов. т.е. я хочу создать второе окно так же как и главное: CreateWindow(.....); ? Например чтобы оно появлялось после нажатия кнопки.
Автор: Abs62
Дата сообщения: 08.10.2006 13:49
Thritt
Да вот так и сделать - создать окно с помощью CreateWindow, создать в нём нужные элементы опять же с помощью CreateWindow, самостоятельно реализовать их обход по Tab/Shift-Tab, переключение на нужный элемент по Alt-letter, реакцию на нажатие Esc/Enter... Короче, взять на себя всю ту рутинную работу, которую совершает Windows, создавая диалог из шаблона.

PS. А зачем этот геморрой?
Автор: Thritt
Дата сообщения: 08.10.2006 21:32

Цитата:
Да вот так и сделать - создать окно с помощью CreateWindow, создать в нём нужные элементы опять же с помощью CreateWindow, самостоятельно реализовать их обход по Tab/Shift-Tab, переключение на нужный элемент по Alt-letter, реакцию на нажатие Esc/Enter... Короче, взять на себя всю ту рутинную работу, которую совершает Windows, создавая диалог из шаблона.

А можно поподробнее? А то я что-то совсем уже запутался с этим WinAPI.




Добавлено:
Может статьи какие есть? мне бы не помешали ссылки на них
Автор: Abs62
Дата сообщения: 08.10.2006 22:59
Thritt

Цитата:
А можно поподробнее? А то я что-то совсем уже запутался с этим WinAPI.

Поподробнее - Ч.Петзольд, "Программирование в среде Windows" (можно взять здесь). Чистый WinAPI с самых азов. Глава 8 - "Дочерние окна управления", там есть примеры.
Автор: vrsoft
Дата сообщения: 09.10.2006 08:49
заходите на http://spam_detected/ - новый портал
Автор: ramzy
Дата сообщения: 09.10.2006 13:59
Пытался перехватить нажатие клавиши Tab в С++.....
Все примеры, которые я нашел в Инете, относились к Делфи...
Нашел интересную статью http://www.sources.ru/msdn/library/using_keyboard_input.shtml
руководствуюясь ею, попробовал перехватывать при условии
.......(HWND hWnd,
UINT msg,
WPARAM w,
LPARAM l)
{
if ((msg ==WM_CHAR)&&
(w == 0x09))...........
но ничего не получилось, начал разбираться, выяснил что при нажатии таб msg == 48384 т.е. 0xBD00, а WM_CHAR = 258(0x0102)......

Кто нибудь может мне объяснить, т.е. или я чего то не понял из этой статьи...

Заранее благодарен!
Автор: TeXpert
Дата сообщения: 09.10.2006 16:54
ramzy
Читай Поетзолда.
Автор: Abs62
Дата сообщения: 09.10.2006 21:04
ramzy

Цитата:
выяснил что при нажатии таб msg == 48384 т.е. 0xBD00, а WM_CHAR = 258(0x0102)

Значит, кто-то уже обработал сообщение до того. И послал совсем другое.
Автор: Qraizer
Дата сообщения: 12.10.2006 21:17
Abs62

Цитата:
PS. А зачем этот геморрой?

Не обязательно так сложно. Есть DialogBoxIndirect(), так она делает то же самое, что и DialogBox(), но шаблон передаётся явно укадателем на подготовленную структуру в памяти. Я так сильно подозреваю, что DialogBox() загружает ресурс диалога, а потом просто вызывает DialogBoxIndirect().
Автор: Abs62
Дата сообщения: 12.10.2006 23:48
Qraizer

Цитата:
Не обязательно так сложно. Есть DialogBoxIndirect(), так она делает то же самое, что и DialogBox(), но шаблон передаётся явно укадателем на подготовленную структуру в памяти.

Разумеется, можно и так. Но писать десяток строк кода вместо одной строки шаблона - это тоже геморрой.
Автор: Qraizer
Дата сообщения: 17.10.2006 20:34
Не спорю. . Однако ж понадобилось человеку. Да и через CreateWindow() строчек ИМХО побольше будет.
Автор: Abs62
Дата сообщения: 17.10.2006 22:11
Qraizer

Цитата:
Да и через CreateWindow() строчек ИМХО побольше будет.

Зато можно будет на собственном опыте разобраться, как же это всё устроено.
Автор: N0el
Дата сообщения: 20.10.2006 23:14
Вечер добрый всем.
Нужна небольшая помощь.
Есть окошко, есть кнопочка - обыкновенный "BUTTON"
нужно на эту кнопочку навесить всплывающее меню.
Чтоб при нажатии именно на эту кнопочку выскакивало PopupMenu.
C другой стороны само окошко не должно ловить этот вызов.
Жду вашей помощи))
Автор: Abs62
Дата сообщения: 21.10.2006 00:22
N0el

Цитата:
Есть окошко, есть кнопочка - обыкновенный "BUTTON"
нужно на эту кнопочку навесить всплывающее меню.

TrackPopupMenu в обработчике нажатия. Само меню либо грузить из ресурсов (LoadMenu), либо формировать динамически (CreatePopupMenu и т.д.).

Цитата:
C другой стороны само окошко не должно ловить этот вызов.

Какой вызов? Обыкновенный "BUTTON" отправляет родителю BN_CLICKED, в обработчике которого обычно и производятся все действия.
Автор: TeXpert
Дата сообщения: 21.10.2006 01:34
N0el

Цитата:
Есть окошко, есть кнопочка - обыкновенный "BUTTON"
нужно на эту кнопочку навесить всплывающее меню.

Странная логика приложения... Может, по-другому всё же?


Цитата:
Чтоб при нажатии именно на эту кнопочку выскакивало PopupMenu.
C другой стороны само окошко не должно ловить этот вызов.

А тут противоречие -- без обработки этого события (нажатие) нельзя и сделать так чтобы "выскакивало PopupMenu". Так чего же всё-таки хотим?
Автор: 22222
Дата сообщения: 21.10.2006 17:29
Abs62
Ну вот, он я как понял хочет ловить BN_CLICKED, и не отправлять его дальше родителю, а показывать свое окно.
Автор: Thritt
Дата сообщения: 21.10.2006 20:21
Возможно это уже где-то обсуждалось на форуме. я не искал, если дадите ссылки буду рад. У меня вот такой вопрос: имеется окно, в окне одна кнопка. Вот как на эту кнопку поместить Битмап?
Автор: Qraizer
Дата сообщения: 21.10.2006 21:09
Ставишь этой кнопке стиль BS_OWNERDRAW, и тебе будет приходить сообщение WM_DRAWITEM. Смотри MSDN для деталей.
Автор: Abs62
Дата сообщения: 21.10.2006 21:10
22222
Ловить где? Button BN_CLICKED не получает, он его генерирует и отправляет родителю.
Автор: Thritt
Дата сообщения: 21.10.2006 22:32
Qraizer
чесно говоря я не понял как сделать... Я создаю ресурс - Битмап, загружаю в переменную HBITMAP, а что дальше с этой переменной делать я не знаю.. в MSDN читал про WM_DRAWITEM и DRAWITEMSTRUCT, но что-то толком ничего не понял
а свойство BS_BITMAP зачем? оно никак не может пригодиться?
Автор: Abs62
Дата сообщения: 22.10.2006 00:04
Thritt

Цитата:
а что дальше с этой переменной делать я не знаю..

Читать дальше про CreateCompatibleDC, SelectObject, BitBlt.

Цитата:
а свойство BS_BITMAP зачем? оно никак не может пригодиться?

Может.
Если указать этот стиль для кнопки и послать ей BM_SETIMAGE c IMAGE_BITMAP в wParam и хэндлом битмапа в lParam. Тогда можно не заморачиваться с BS_OWNERDRAW.
Автор: 22222
Дата сообщения: 22.10.2006 05:50
Abs62

Цитата:
Ловить где? Button BN_CLICKED не получает, он его генерирует и отправляет родителю.

Поскольку он сказал, что само окно не должно ловить это сообщение, то это похоже на сабклассинг, когда одно окно генерирует сообщение, но на этапе отправки его родителю, сообщение перехватывается и обрабатывается как ему надо и далее родителю не отправляется. Но это лишь догадки и речь может идти совсем о другом, так как автора самого еще нет
Автор: Thritt
Дата сообщения: 22.10.2006 11:18
Abs62
Значит я пишу:

HBITMAP bm = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));

HWND Btn1 = CreateWindowW(TEXT("BUTTON"), NULL,
        WS_CHILD|WS_VISIBLE|BS_BITMAP,
        10, 130, 130, 35,
        hWnd, (HMENU)ID_BTN1,
(HINSTANCE)GetWindowLongW(hWnd, GWL_HINSTANCE), NULL);

SendMessage(Btn1, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)bm);

и ничего не получается...

Добавлено:
Abs62

Цитата:
Читать дальше про CreateCompatibleDC, SelectObject, BitBlt.

Все. теперь почитал повнимательнее, разобрался. Спасибо за помощь.

Добавлено:
Блин, теперь возникла новая проблема: как менять Битмап, расположенный на кнопке, в ходе работы программы? Например при наведении курсора мыши на кнопку, или что-нибудь подобное?
Автор: ShIvADeSt
Дата сообщения: 23.10.2006 01:11

Цитата:
Блин, теперь возникла новая проблема: как менять Битмап, расположенный на кнопке, в ходе работы программы? Например при наведении курсора мыши на кнопку, или что-нибудь подобное?

Ага вначале только выбери способ определения, что курсор наведен на кнопку (если ты не в курсе. то у кнопки нет события на вход и выход мыши, зато есть разные способы это сделать). Как только определишься со способом, реализовать отрисовку другого битмапа проще просто, копать в сторону InvalidateRect, создаешь глобальный хэндл битмапа и при событии входа мыши грузишь туда новый битмап. После этого инвалидейт и уже отрисовывается с новым битмапом.
Автор: Thritt
Дата сообщения: 23.10.2006 10:05
ShIvADeSt

Цитата:
Ага вначале только выбери способ определения, что курсор наведен на кнопку


А так нельзя сделать? я просто даже не знаю как еще.

int x, y;

case WM_MOUSEMOVE:
x = LOWORD(lParam);
y = HIWORD(lParam);
if (x < 10 && x > 100 && y > 130 && y < 155)
{
/* тут нужно нарисовать новый битмап */
}
else
{
/* оставить старый */
}
break;

Добавлено:
я вот что-то никак не пойму почему так получается: например если менять картинку по нажатию левой кнопки мыши в любом месте:
case WM_RBUTTONDOWN:
    bm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
    InvalidateRect(hWnd, NULL, FALSE);
    break;
картинка меняется если только курсор НЕ наведен на кнопку. т.е. если щелкать в любом месте окна - картинка меняется, а если щелкнуть по кнопке то ничего не происходит. Почему так получается?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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