Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual C++ / MFC / WTL > 2 вопросa по winapi


Автор: Jeno 27.12.06, 18:59
№1
Создал win32 aplication в VC++ 2005 (winapi приложение)...в общем, все диалоги и т.д. можно редактировать через оч удобный редактор.. (все это чудо хранится в rc файле)..но я хочу чтоб главное окно тоже бралось с rc, так на много удобней его рисовать :)

№2
Пытаюсь исползовать MessageBox(); пишу вот так: "MessageBox(NULL,"TEST!",NULL,0);"
И оно мне: cannot convert parameter 2 from 'const char [5]' to 'LPCWSTR'

Если пишу вот так: "MessageBox(NULL,LPCWSTR("TEST!"),NULL,0);" ошибок нет, но вместо текста выводятся какие-то карлякули...

Надеюсь вопросы не слишком тупые :) Спасибо заранее :)

Автор: cozzzy 27.12.06, 19:02
1.
Цитата Jeno @
но я хочу чтоб главное окно тоже бралось с rc, так на много удобней его рисовать

Главное тока руками

2. MessageBox(NULL,L"TEST!",L"",0);

Автор: Jeno 27.12.06, 19:03
жалко :(

Автор: Hryak 27.12.06, 20:10
Цитата cozzzy @
2. MessageBox(NULL,L"TEST!",L"",0);

Лучше MessageBox(NULL, _T("TEST!"),_T(""),0);

Автор: Jeno 27.12.06, 22:43
есть щее пару вопросов...
1.как узнать какой тип данных у переменной?
2.как перевести с одного типа в другой? например LPWSTR в u_short... и откуда вообще вы узнаете как переводить с одного типа данных в другой?!их же не мерено...и в мсдн я даже не представляю что написать... :wacko:
з.ы.может где-то дока есть...возможно список все типов данных... :unsure:

Автор: evGenius 28.12.06, 04:25
Цитата Jeno @
их же не мерено

Да их вообще мало, просто такие типы, как LPWSTR всего лишь являются макросами и LPWSTR это всего лишь (wchar_t *)
Цитата Jeno @
в мсдн я даже не представляю что написать...

data conversion routines
Цитата Jeno @
как узнать какой тип данных у переменной?

Посмотри на typeid()

Автор: alexander.stoyan 28.12.06, 08:14
1. чтобы главное было в .rc файле - создавай MFC Dialog
2. MessageBox(NULL, TEXT("Hello !!!"), NULL, MB_OK) - без подключения MFC
MessageBox(NULL, _T("Hello !!!"), NULL, MB_OK) - с подключением MFC

если хочешьо задавать явно, то:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    MessageBoxA(NULL, "Hello !!!", NULL, MB_OK); // ANSI
    MessageBoxW(NULL, L"Hello !!!", NULL, MB_OK); // Unicode


непонятно токо, зачем переводить LPWSTR в u_short???
LPWSTR - это указатель (4 байта), а u_short - число (2 байта)... потери будут !

Автор: ElcnU 28.12.06, 08:34
Цитата alexander.stoyan, 28.12.2006, 10:14:30, 1394212
1. чтобы главное было в .rc файле - создавай MFC Dialog

разницы помоему нет какой тип проекта
если MFC то лезим в InitInstance и там решаем кто будет главным.
если АПИ, то помоему там тоже всё понятно :yes:

Автор: Jeno 28.12.06, 11:55
есть поле для ввода текста, оно возвращет данные в LPWSTR, нужно эти данные вставить в функцию...
вот смотрите:

вот так вот появляется ошибка...потому что inet_addr() и htons() ругается на то что port и host являются LPWSTR...
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    char port[10] = "";
    char host[50] = "";
    GetDlgItemText(hDlg,IDC_PORT,LPWSTR(port),10);
    GetDlgItemText(hDlg,IDC_HOST,LPWSTR(host),50);
     
    clientService.sin_addr.s_addr = inet_addr(host);
    clientService.sin_port = htons(port);


и я не знаю как переконвертировать....пробовал вот так:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    clientService.sin_port = htons(u_short(port));
ошибок нет, но данные повреждаются...

Автор: alexander.stoyan 28.12.06, 11:58
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    char port[10] = "";
    char host[50] = "";
    GetDlgItemTextA(hDlg,IDC_PORT,port,10);
    GetDlgItemTextA(hDlg,IDC_PORT,host,50);
     
    clientService.sin_addr.s_addr = inet_addr(host);
    clientService.sin_port = htons(port);

Автор: ElcnU 28.12.06, 12:10
может так?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int WideCharToMultiByte(
      UINT CodePage,            // code page
      DWORD dwFlags,            // performance and mapping flags
      LPCWSTR lpWideCharStr,    // wide-character string
      int cchWideChar,          // number of chars in string
      LPSTR lpMultiByteStr,     // buffer for new string
      int cbMultiByte,          // size of buffer
      LPCSTR lpDefaultChar,     // default for unmappable chars
      LPBOOL lpUsedDefaultChar  // set when default char used
    );

Автор: Jeno 28.12.06, 12:23
Цитата ElcnU @
может так?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int WideCharToMultiByte(
      UINT CodePage,            // code page
      DWORD dwFlags,            // performance and mapping flags
      LPCWSTR lpWideCharStr,    // wide-character string
      int cchWideChar,          // number of chars in string
      LPSTR lpMultiByteStr,     // buffer for new string
      int cbMultiByte,          // size of buffer
      LPCSTR lpDefaultChar,     // default for unmappable chars
      LPBOOL lpUsedDefaultChar  // set when default char used
    );

это для винапи?

з.ы.мне нужно научится переводить типы данных....или не возможно перевести LPWSTR в u_short???

-Added
Цитата alexander.stoyan @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    char port[10] = "";
    char host[50] = "";
    GetDlgItemTextA(hDlg,IDC_PORT,port,10);
    GetDlgItemTextA(hDlg,IDC_PORT,host,50);
     
    clientService.sin_addr.s_addr = inet_addr(host);
    clientService.sin_port = htons(port);

port и host приходится переводить в LPWSTR, так как GetDlgItemText() ругается....просит LPWSTR а не char....

Автор: alexander.stoyan 28.12.06, 12:28
а ты точно GetDlgItemTextA написал?

Автор: ElcnU 28.12.06, 12:42
Цитата Jeno, 28.12.2006, 14:23:56, 1394613
з.ы.мне нужно научится переводить типы данных....или не возможно перевести LPWSTR в u_short???

ну и переведёшь в соответствии с требуемой кодировкой

Автор: Jeno 28.12.06, 13:35
вот смотрите:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void mconnect(u_short port, char *host)
    {
        ...
        clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
        clientService.sin_port = htons(port);
        ...
    }
     
    char port[10] = "";
    char host[50] = "";
    GetDlgItemTextA(hDlg,IDC_PORT,port,10);
    GetDlgItemTextA(hDlg,IDC_HOST,host,50);
    mconnect(u_short(port),host);


ошибок нет, но данные повреждаются (когда в поле (IDC_PORT) вписываю порт 8090 то клиент пытается подконнектится и потом выдает ошибку...но если я в htons(port); вместо переменной port вписываю просто 8090 то все ок)...где нужно исправить?! и помечу???
з.ы.сори за наглость...больше не у кого спросить.. :'(

Автор: LuckLess 28.12.06, 13:58
Jeno
char a[3] = "30";
это срока! строка состоит из 3-х символов, каждый по байту. первый символ - '3', второй - '0', третий - символ конца строки - '\n';

тебе нужет u_short, что есть unsigned short, что есть 2 байтоное целое число!!
хоть строка и есть число, но представлена она в совершенно другом формате!
Откуда компьютер знает что те символы которые ты ввел - это число в конце концов? Это должен знать (и проверять) ты!!
и затем из этих символов сделать нормальное, понятное компьютеру число!
для этого есть ряд средств.

из чистого C++ есть строковые потокаи для узких и широких символоа (stringstream, wstringstream)
на апи есть atoi, wtoi

Автор: wertyman 29.12.06, 04:19
Цитата LuckLess @
третий - символ конца строки - '\n';

хочу не согласится, конец строки это \0!

а по делу, у человека помоему в проекте прописано #define UNICODE, если у него компилятор постоянно пытается подсунуть ему Unicode АПИшки...

Автор: LuckLess 29.12.06, 08:41
Цитата wertyman @
хочу не согласится, конец строки это \0!

ну да..
Цитата wertyman @
а по делу, у человека помоему в проекте прописано #define UNICODE, если у него компилятор постоянно пытается подсунуть ему Unicode АПИшки...

ну да.. виндовый проект по умолчанию юникодный вродебы..

Автор: wertyman 29.12.06, 11:42
Цитата LuckLess @
ну да.. виндовый проект по умолчанию юникодный вродебы..

Вот блин, это 2005 такие чудеса выдает чтоли ? :wacko:
И зачем оно надо, пусть человек работает нормально со строками...

Автор: LuckLess 29.12.06, 12:22
Цитата wertyman @
И зачем оно надо, пусть человек работает нормально со строками...

а чем тебе широкие строки не нормальные?

Автор: mad_avenger 29.12.06, 17:22
ответ на 1-й вопрос: Рисуй главное окно в редакторе, а показывай его так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void Main()
    {
        DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc);
    }



Тупой пример из э-э... статьи... :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include "windows.h"
    #include "resource.h"
     
    char msg[1000];
    char buf[100];
    char bigb[100];
    char minb[100];
     
    INT_PTR CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_INITDIALOG:
            SetClassLong(hwndDlg, GCL_HICON, (LONG)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));        
            break;
        case WM_COMMAND:
            if (HIWORD(wParam)==BN_CLICKED)
            {
                switch(LOWORD(wParam))
                {
                case IDOK:
                    GetDlgItemText(hwndDlg,IDC_EDIT1,buf,100);
                    lstrcpy(bigb,buf);
                    lstrcpy(minb,buf);
                    CharUpper(bigb);
                    CharLower(minb);
                    wsprintf(msg,"Пароль: '%s'\nБольшими: '%s'\nМаленькими: '%s'\nЧислобукофф: %i\n\nАминь.",
                        buf,bigb,minb,lstrlen(buf));
                    MessageBox(hwndDlg,msg ,"Пароль:",MB_ICONINFORMATION);
                    break;
                case IDCOPUT:
                    SendMessage(hwndDlg,WM_CLOSE,0,0);
                    break;
                }
            }
            break;
        case WM_CLOSE:
            if (MessageBox(hwndDlg,"Закрыть?","",MB_YESNO)==IDYES)
            {
                EndDialog(hwndDlg,0);
            }
            break;
        }
        return 0;
    }
     
    void Main()
    {
        DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc);
    }

Автор: Jeno 29.12.06, 17:39
Цитата mad_avenger @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void Main()
    {
        DialogBox(GetModuleHandle(NULL),(LPCSTR)IDD_DIALOG1,NULL,DlgProc);
    }

вот это и т.п. получается не нужно?
з.ы.если я не создаю окно, а загружаю его с РС, знач мне не нужно это?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wcex;
     
        wcex.cbSize = sizeof(WNDCLASSEX);
     
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINAPI));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WINAPI);
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
     
        return RegisterClassEx(&wcex);
    }



За пример спасибо огромное :)
з.ы.а где такие статьи можно найти? просто все самому приходится узнать....весь мсдн перерыл пока нашел что мне нужно :)

Автор: maksa_2000 30.12.06, 19:56
на счет постоянной конвертации из широких символов в простые, зачем усложнять себе жизнь и использовать char веть есть же замечательный тип TCHAR. А на счет главного окна, то его тоже можно сделать диалогом и спокойно редактировать через редактор.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)