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

» C++ WinAPI

Автор: Abs62
Дата сообщения: 14.03.2011 19:42
V0lt
Попробуй глянуть сюды:
Customizing the Appearance of CSliderCtrl Using Custom Draw
Автор: user_MAN09
Дата сообщения: 26.03.2011 17:35
всем привет, проект MFC App,
есть
char tStr[255];
применяю к Edit Control функц GetWindowText(LPTSTR (tStr), 255)
после запуска вбиваю в Edit - 1111. функ возвращает токо 1-ый символ,
в чем причина?
Автор: Abs62
Дата сообщения: 26.03.2011 17:56
user_MAN09
В том, что юникодные функции работают с юникодными строками. И если им силой впихнуть массив char вместо wchar_t, они всё равно заполнят его юникодными (двухбайтовыми) символами. Отсюда и дальнейшие непонятки.

Цитата:
есть
char tStr[255];

А должно быть TCHAR tStr[255].

Цитата:
TCHAR:
A WCHAR if UNICODE is defined, a CHAR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
Автор: user_MAN09
Дата сообщения: 26.03.2011 19:24
полезная информация Abs62,
но приходится менять много функц в коде, которые работали с char,
не могу найти аналога gethostbyname(char) для TCHAR,
please, help me!
Автор: Abs62
Дата сообщения: 26.03.2011 19:45
user_MAN09

Цитата:
Note The gethostbyname function has been deprecated by the introduction of the getaddrinfo function. Developers creating Windows Sockets 2 applications are urged to use the getaddrinfo function instead of gethostbyname.

У getaddrinfo есть юникодный вариант - GetAddrInfoW.
Автор: user_MAN09
Дата сообщения: 26.03.2011 20:48
Abs62 спасибо за помощь, но я разбирал следующий участок кода:

struct hostent *host=NULL;        
    host = gethostbyname(chStr);
    if (host == NULL)
    {
        SetDlgItemText(IDC_STATIC,
            L"Unable to resolve host");
        return;
    }
и т. д.

а функц getaddrinfo и getaddrinfoW тут не подходят, пришлось добавить строчки
и использовать еще одну не безопасную функцию

char chStr[255];
CharToOem(tStr,chStr);


может поэтому в итоге вместо списка открытых портов я получил абракадабру?


Автор: Abs62
Дата сообщения: 26.03.2011 21:00
user_MAN09

Цитата:
CharToOem(tStr,chStr);

Это не то, это просто смена кодировки ANSI->OEM. Преобразованием WCHAR -> char занимается WideCharToMultiByte.
Автор: user_MAN09
Дата сообщения: 26.03.2011 21:13
Abs62. я смотрел на MSDN, вроде то, потому что еще проверял во время отладки программы

присваивал tchar tStr[255] 127.0.0.1 ч/з

chHostName.GetWindowText(tStr, 255); //chHostName - edit control

затем благополучно

CharToOem(tStr,chStr); //char chStr[255]

работает потому что chStr = 127.0.0.1
и уже потом host = gethostbyname(chStr);



Автор: Abs62
Дата сообщения: 26.03.2011 22:22
user_MAN09
Да, действительно. Но всё равно лучше использовать WideCharToMultiByte. Не случайно же про CharToOem в MSDN сказано "Do not use".
Автор: user_MAN09
Дата сообщения: 27.03.2011 18:39
Привет Abs62, доделал вчерашний код, вопрос не по С++, тем не менее
связан с кодировками, открываю книгу формата .chm, содержание - абракадабра,
а сам текст нормальный, глаза мозолит, может выручишь, как вчера?
Автор: Abs62
Дата сообщения: 27.03.2011 19:10
user_MAN09
Да уж, это совсем не в тему.
Возьми htm2chm, разбери им книгу и собери обратно, указав при сборке русский язык.
Автор: user_MAN09
Дата сообщения: 27.03.2011 20:01
Abs62, всехблаг!
Автор: user_MAN09
Дата сообщения: 28.03.2011 19:30
Доброго вечера!

Как решить такую проблему?

PMIB_TCPTABLE pTcpTable
DWORD dwNumEntries

for (int i=0; i<pTcpTable->dwNumEntries; i++)

warning C4018: <: несоответствие типов со знаком и без знака

так понимаю что проба в том, что DWORD и int не очень ладят, что делать?
Автор: Abs62
Дата сообщения: 28.03.2011 19:43
Да много чего можно.
1. Использовать unsigned i вместо int i.
2. Явно привести в операторе сравнения pTcpTable->dwNumEntries к int или i к unsigned.
3. Отключить это предупреждение - #pragma warning(disable : 4018)
4. Не обращать на него внимания.
...
Автор: HelioSS
Дата сообщения: 28.03.2011 19:50
Abs62

Цитата:
HelioSS
Что имеется в виду под "Text Control"? Если обычный static control, то есть несколько вариантов. Один - задать ему стиль SS_NOTIFY и ловить сообщение STN_CLICKED в родительском окне. Другой - ловить в родительском окне WM_LBUTTONDOWN и проверять место, куда попал клик. Разбирался пару страниц назад. Ещё вариант - переопределить оконную функцию static control и ловить WM_LBUTTONDOWN там.

А можно пример кода?
Автор: user_MAN09
Дата сообщения: 28.03.2011 19:50
благ Abs62, 3-й варик делал,про 1 и 4 думал,
а второй (pTcpTable->dwNumEntries к int) лень было вспоминать как делать)))

Автор: Abs62
Дата сообщения: 28.03.2011 20:21
HelioSS

Цитата:
А можно пример кода?

По какому варианту? Если по первому, то всё как обычно. Ловим STN_CLICKED в обработчике сообщений родительского окна и делаем что нам нужно.

Код: switch(message) {
...
case WM_COMMAND:
if(LOWORD(wParam) == IDC_MY_STATIC_CONTROL && HIWORD(wParam) == STN_CLICKED) {
// Тут делаем, что нужно.
}
...
break;
...
}
Автор: user_MAN09
Дата сообщения: 01.04.2011 19:09
Привет Abs62, проект MFC - тема отправка ICMP пакетов-запросов (ping)
объявлены следующие структуры:

typedef struct tagECHOREQUEST
{
    ICMPHDR icmpHdr;
    DWORD dwTime;
    char cData[64];
}ECHOREQUEST, *PECHOREQUEST;

typedef struct tagICMPHDR
{
    u_char Type;
    u_char Code;
    u_short Checksum;
    u_short ID;
    u_short Seq;
    char Data;
}ICMPHDR, *PICMPHDR;

static ECHOREQUEST echoReq;
echoReq.icmpHdr.Type    = ICMP_ECHOREQ;







Добавлено:
ICMP_ECHOREQ: необъявленный идентификатор
подключена ws2_32.lib
старая константа? или какую то библиотеку подключить? или то и то)))
Автор: Abs62
Дата сообщения: 01.04.2011 20:25
user_MAN09
Кто код писал, у того и надо спрашивать.
Если хочешь разобраться, что тут что, берёшь спецификацию протокола ICMP и смотришь там.
Автор: user_MAN09
Дата сообщения: 02.04.2011 18:50
разобрался))) код писал фленов
Автор: user_MAN09
Дата сообщения: 03.04.2011 18:41
Здорово Abs62, почти закончил книгу, )))

последний пример, выручай

BYTE bPhysAddr;
char sPhysAddr[256]

Как значение bPhysAddr копировать в sPhysAddr (из byte в char)
Автор: Abs62
Дата сообщения: 03.04.2011 18:56
user_MAN09
wsprintf(sPhysAddr, "%X", bPhysAddr). Или itoa(bPhysAddr, sPhysAddr, 16).
Если, конечно, я правильно понял, что требуется.
Автор: user_MAN09
Дата сообщения: 04.04.2011 21:52
Abs62, Благодарю, попробую, wsprintf с небольшими манипуляциями подходит вроде)))
Автор: V0lt
Дата сообщения: 06.04.2011 19:43
Как правильнее ограничивать минимальный размер окна, с учетом того, что контролы на нем тоже меняются и также имеют свои минимальные размеры?
Автор: ShIvADeSt
Дата сообщения: 07.04.2011 02:49
V0lt
WM_SIZE сообщение ловить и в нем разрешать или нет. Или что то другое подразумевалось?
Автор: V0lt
Дата сообщения: 07.04.2011 06:18
Вообщем есть главное окно. В нем есть самые разные "контролы". Каждый "контрол" имеет какой-то минимальный размер, при котором он еще нормально отображается. Это размер надо как-то где-то задать. Нужно менять размер главного окна, так чтобы все отображаемые "контролы" не уменьшились меньше своих минимальных размеров. "Контрол" может отображаться, а может быть скрыт, в последнем случае считаем, что его нет на главном окне.

Сейчас в главном окне в OnGetMinMaxInfo идет расчет его минимального размера. Для контролов пришлось придумать оригинальное свойство GetMinWidth(). Это мне кажется не самым удачным. Хотелось бы обойтись более стандартными средствами.

Я хочу разобраться хотя-бы с шириной. Высота у "контролов" фиксированная и считается через CalcFixedLayout(TRUE, TRUE).cy
Автор: ShIvADeSt
Дата сообщения: 07.04.2011 06:41
V0lt

Цитата:
Сейчас в главном окне в OnGetMinMaxInfo идет расчет его минимального размера. Для контролов пришлось придумать оригинальное свойство GetMinWidth(). Это мне кажется не самым удачным. Хотелось бы обойтись более стандартными средствами.

Почитай тут, там предлагается класс по твоей проблеме. Посмотри реализацию, может подойдет
http://www.codeguru.com/cpp/w-d/dislog/resizabledialogs/article.php/c1947
Автор: Aleksoid1978
Дата сообщения: 08.04.2011 06:19
Вопрос ко всем - как можно отловить момент когда пользователь "остановился" перетаскивать окно. Т.е. когда мы перетаскиваем окно и в конце отпускаем кнопку мышки.
OnMove и OnMoving - ясно дело не подходят, т.к. они их события срабатывают все время пока мы перемещаем окно.

Есть мысль - параллельно следить за мышкой, и как только мышка перестала двигаться и не надата левая клавиша - считать что перемещение закончено.

Что скажете ???
Автор: ShIvADeSt
Дата сообщения: 08.04.2011 06:47
Aleksoid1978

Цитата:
Вопрос ко всем - как можно отловить момент когда пользователь "остановился" перетаскивать окно. Т.е. когда мы перетаскиваем окно и в конце отпускаем кнопку мышки.

Ловить в своем приложении или в чужом (в смысле ловить перемещение любого окна)?
Автор: Abs62
Дата сообщения: 08.04.2011 08:15
Aleksoid1978
Взводить некий флаг в обработчике WM_MOVING и проверять/сбрасывать его в обработчиках WM_NCLBUTTONUP и WM_LBUTTONUP. Пойдёт?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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