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

» C++ WinAPI

Автор: TeXpert
Дата сообщения: 28.05.2007 00:37
Garrett
Цитата:
Про Круглински. 5-ое издание было издано уже после смерти Круглински
Да, ошибся, впрочем и не был уверен. А диск можешь и не искать там, насколько помню, самой книги нет. Мне бы лишь дополнение. Люблю краткие вещи.

А Петцолда ему полезно читать, больше, а MFC вряд ли прибавит понимания.
Автор: ShIvADeSt
Дата сообщения: 28.05.2007 03:55
Вот регистрация глобального хоткея
RegisterHotKey(frmCaster.Handle,GlobalAddAtom('Active'),MOD_CONTROL,VK_F10);
если первый параметр не нулевой, то хоткей посылается окну с соотв хэндлом.
Автор: plazzmex
Дата сообщения: 28.05.2007 18:03
Abs62

Цитата:
В смысле CreateFont (или CreateFontIndirect).

ок... спасибо..

Цитата:
По определению.
Для загрузки иконки DialogBox использует функцию LoadIcon, а она грузит иконку только одного размера.

всмысле он берет иконку которая загрузилась для самой программы?
а можно загрузить две иконки?
Garrett

Цитата:
Петцольда залить нетрудно, будет ли товарищ читать?

можно попробовать..
ShIvADeSt

Цитата:
Вот регистрация глобального хоткея
RegisterHotKey(frmCaster.Handle,GlobalAddAtom('Active'),MOD_CONTROL,VK_F10);
если первый параметр не нулевой, то хоткей посылается окну с соотв хэндлом.

а куда я должен вставлять эту функцию ? на нажатие кнопки?
Автор: Abs62
Дата сообщения: 28.05.2007 19:29
plazzmex

Цитата:
всмысле он берет иконку которая загрузилась для самой программы?

В смысле он грузит иконку, которая ему указана. Её размеры должны соответствовать системным параметрам SM_CXICON и SM_CYICON. Если в указанном ресурсе несколько иконок с разными размерами - выбирает соответствующую.
Иконка для программы указывается в поле hIcon класса главного окна программы при его регистрации. Что ты туда прописал - то и будет.

Цитата:
а можно загрузить две иконки?

Хоть десять - используй функцию LoadImage. Но работать с ними придётся самостоятельно.
Автор: plazzmex
Дата сообщения: 28.05.2007 19:47
Abs62
ок..

насчет фонта.. я сделал вот так:

Код:
case WM_SETFONT:
static LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = DEFAULT_PITCH;
lf.lfFaceName, "Microsoft Sans Serif";
lf.lfHeight = 16;
lf.lfWeight = 700;
lf.lfUnderline = TRUE;
HFONT hMFont = CreateFontIndirect(&lf);
if ((HWND)wParam == GetDlgItem(hwnd,IDC_NAMEBOLD))
{
SelectObject((HDC)wParam,hMFont);
}
break;
Автор: Abs62
Дата сообщения: 28.05.2007 20:06
plazzmex
Так ведь не реагировать на WM_SETFONT надо, а самому его посылать.

Код:
...
HFONT hMFont = CreateFontIndirect(&lf);
SendDlgItemMessage(hwnd,IDC_NAMEBOLD,WM_SETFONT,(WPARAM)hMFont,(LPARAM)TRUE);
Автор: plazzmex
Дата сообщения: 28.05.2007 20:48
все работает.. спасибо.. только вот почему то пишет Warning:

Цитата:

172 ...\Main.c [Warning] left-hand operand of comma expression has no effect
172 ...\Main.c [Warning] statement with no effect

вот строчка 172 (относится к созданию фонта):

Код:
lf.lfFaceName, "Microsoft Sans Serif";
Автор: xdude
Дата сообщения: 28.05.2007 20:54
plazzmex
Вероятно, там не запятая нужна, а =:
lf.lfFaceName = "Microsoft Sans Serif";
Автор: plazzmex
Дата сообщения: 28.05.2007 20:57
да нет..
когда ставлю = пишет "Error: incompatible types in assignment."
Автор: TeXpert
Дата сообщения: 28.05.2007 21:10
plazzmex
Цитата:
lf.lfFaceName, "Microsoft Sans Serif";
Ну так догадайся, что тут неправильного) Иногда думай всё же).
Автор: Abs62
Дата сообщения: 28.05.2007 21:33
plazzmex

Цитата:
когда ставлю = пишет "Error: incompatible types in assignment."

Ну так надо же понимать разницу между указателем и массивом.
Поле lfFaceName объявлено как TCHAR lfFaceName[LF_FACESIZE], а не как TCHAR *lfFaceName.
Стало быть, не lf.lfFaceName="Microsoft Sans Serif", а lstrcpyn(lf.lfFaceName,"Microsoft Sans Serif",LF_FACESIZE).
А ещё лучше lstrcpyn(lf.lfFaceName,_T("Microsoft Sans Serif"),LF_FACESIZE) - тогда не возникнет проблем при переходе на юникод.
Автор: plazzmex
Дата сообщения: 28.05.2007 22:04
Abs62

Цитата:
lstrcpyn(lf.lfFaceName,"Microsoft Sans Serif",LF_FACESIZE).

ок.. а што дает LF_FACESIZE ?
я счас в книжке одной прочитал и там есть пример. и вэтом примере вот так написано:

Код: strcpy(lf2.lfFaceName, "Microsoft Sans Serif");
Автор: Garrett
Дата сообщения: 28.05.2007 22:19
TeXpert
Abs62
Парнишка начинает надоедать. Не надо отвечать ему, пусть научится пользоваться MSDN.
Автор: Abs62
Дата сообщения: 28.05.2007 22:32
plazzmex

Цитата:
а чем оно отличается от того что ты написал? это хуже ?

strcpy(s1,s2) копирует всю строку s2 в s1, независимо от длины. strcpyn(s1,s2,n) копирует не более n символов. Страховка на случай, если строка окажется длиннее, чем допустимо.
Автор: plazzmex
Дата сообщения: 28.05.2007 23:44
Garrett

Цитата:
Парнишка начинает надоедать. Не надо отвечать ему, пусть научится пользоваться MSDN.

втом то и дело.. что я сначала ищу вMSDN и если не нахожу то спрашиваю вас..
ну вы же умные.. а я тупой..

Abs62
TeXpert
Garrett
ShIvADeSt
огромное спасибо за помощь !!!!
я уже и вправду переборщил с вопросами.
и надоел вам всем..

еще раз огромное спасибо !


....Plazzmex
Автор: Garrett
Дата сообщения: 29.05.2007 08:00
plazzmex
Петцольда залил на свой сайт (http://alexsoft.home.nov.ru), ищи в Программах.
Автор: Qraizer
Дата сообщения: 29.05.2007 13:54
В догонку: за "...массивы и указатели в С и С++ - это одно и тоже...", которое то и дело проскакивает в учебниках, я б эти учебники вместе с авторами в топку.
Автор: TeXpert
Дата сообщения: 29.05.2007 16:17
Qraizer
Батенька, да вы инквизитор). Ну, с другой стороны, человек научится, обжёгшись.
Автор: Qraizer
Дата сообщения: 30.05.2007 17:39
Ну да. Типа - "Мальчик , сунь пальцы в розетку... Ага! Понял, что этого делать никогда нельзя?"
Автор: plazzmex
Дата сообщения: 15.06.2007 23:13
помогите пожалуйста...
я уже пол дня сижу и у меня никак не работает галочка в сплывающем меню.. все пересмотрел, MSDN почитал.. но вроде делаю все правильно а оно не работает.
глупость блин, аж спрашивать стыдно.

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

вот часть кода меню: (а именно, тот пункт в котором галочка..)

Код: InsertMenu(hPopupMenu, 1, MF_BYPOSITION | MF_STRING | MF_CHECKED, ID_CONTEXT_MENU1, "&Check");
Автор: Qraizer
Дата сообщения: 16.06.2007 15:36
GetMenuState() возвращает полное состояние элемента меню. Поэтому это набор флагов, а не один единственный флаг. Попробуй if ((CheckMenu & MF_CHECKED) != 0) ...
Автор: plazzmex
Дата сообщения: 16.06.2007 16:11
все равно не работает..
это может быть из за того что меню это на айконе в трее ?
или из за того что это не resource.rc а меню прямо на правой кнопке миши ?
Автор: Lyrik
Дата сообщения: 16.06.2007 16:52
plazzmex
попробуй так:

Код: CheckMenuItem(hPopupMenu, 1, MF_BYPOSITION|MF_UNCHECKED );
Автор: plazzmex
Дата сообщения: 16.06.2007 17:16
Lyrik
нет.. не помогает.. ничего не происходит..

может нужно как то обновлять меню? как я допустим делаю в WM_PAINT InvalidateRect ?
или может нужно еще что то добавить что я не написал?
Автор: Hiken
Дата сообщения: 16.06.2007 17:37
plazzmex, в самом деле, хорошо бы ты сделал меню в ресусе, мог бы здесь привести его полностью, а мы бы посмотрели. Никаких Invalidate'ов не требуется, это точно.

А вообще, я бы проверял на галочку так:

Код: if (GetMenuState(hPopupMenu, 1, MF_BYPOSITION) & MF_CHECKED)
Автор: Lyrik
Дата сообщения: 16.06.2007 17:48
plazzmex
а hPopupMenu у тя как static? или ты его потом получаешь?
Автор: plazzmex
Дата сообщения: 16.06.2007 18:57
Hiken

Цитата:
InsertMenu с индексом 0 делал?

всмысле? вот меню:

Код:
case WM_RBUTTONDOWN:
hPopupMenu = CreatePopupMenu();
InsertMenu(hPopupMenu, 1, MF_BYPOSITION | MF_STRING | MF_CHECKED, ID_CONTEXT_MENU1, "&Check");
InsertMenu(hPopupMenu, 2, MF_BYPOSITION | MF_SEPARATOR, 0, 0);
InsertMenu(hPopupMenu, 3, MF_BYPOSITION | MF_STRING , ID_NUMBER1, "&Number One");
SetForegroundWindow(hwnd);
TrackPopupMenu(hPopupMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, 0, hwnd, NULL);
DestroyMenu(hPopupMenu);
return 0;
Автор: Qraizer
Дата сообщения: 16.06.2007 21:14

Цитата:

Код: if ((CheckMenu & MF_CHECKED) != 0)
{
MessageBox(hwnd, "Checked", "Error", MB_OK | MB_ICONINFORMATION);
CheckMenuItem(hPopupMenu, 6, MF_BYPOSITION |MF_CHECKED );
}
else
{
MessageBox(hwnd, "Unchecked", "Error", MB_OK | MB_ICONINFORMATION);
CheckMenuItem(hPopupMenu, 6, MF_BYPOSITION | MF_UNCHECKED );
}
Автор: plazzmex
Дата сообщения: 16.06.2007 22:10
Qraizer

Цитата:
А ты случаем не перепутал "then" и else местами? Я имею в виду последний параметр в вызовах CheckMenuItem()

не понял..... можно поподробнее?
в каком смысле перепутал последний параметр?

Добавлено:
ты имееш ввиду:

Код:
if ((CheckMenu & MF_CHECKED) != 0)
{
MessageBox(hwnd, "Checked", "Error", MB_OK | MB_ICONINFORMATION);
CheckMenuItem(hPopupMenu, 6, MF_BYPOSITION |MF_UNCHECKED );
}
else
{
MessageBox(hwnd, "Unchecked", "Error", MB_OK | MB_ICONINFORMATION);
CheckMenuItem(hPopupMenu, 6, MF_BYPOSITION | MF_CHECKED );
}
Автор: Qraizer
Дата сообщения: 18.06.2007 13:06
Вот тебе кусок мего кода из подобной программки
Код: case WM_RBUTTONDOWN:
GetCursorPos(&curPos);
SetForegroundWindow(hWnd);
retCmd=TrackPopupMenu(hMenu, TPM_RETURNCMD, curPos.x, curPos.y,
0, hWnd, NULL);
switch(retCmd)
{
case IDM_DISABLE:
if(GetMenuState(hMenu, IDM_DISABLE, MF_BYCOMMAND) &
MF_CHECKED)
{
CheckMenuItem(hMenu, IDM_DISABLE,
MF_BYCOMMAND | MF_UNCHECKED);
nid.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(ICON_1));
}
else
{
CheckMenuItem(hMenu, IDM_DISABLE,
MF_BYCOMMAND | MF_CHECKED);
nid.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(ICON_2));
}
nid.uFlags=NIF_ICON;
Shell_NotifyIcon(NIM_MODIFY, &nid);
break;
case IDM_ABOUT:
if(!abouting)
{
DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_1), NULL,
reinterpret_cast<DLGPROC>(aboutProc));
abouting=0;
}
else SetForegroundWindow(abouting);
break;
case IDM_CONFIGURE:
if(!configuring)
{
DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_2), NULL,
reinterpret_cast<DLGPROC>(configProc));
configuring=0;
}
else SetForegroundWindow(configuring);
break;
case IDM_QUIT:
DestroyWindow(hWnd);
break;
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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