Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте с программой, небольшое приложение 
V
    Опции темы
Valeria
  Дата 16.5.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Программа должна открывать текстовый файл, имя которого указывается с командной строки, зачитывать первую строку этого файла и отображать эту строку в окне. Окно программы должно быть отцентровано на экране, и строка должна быть отцентрована в окне по вертикали и горизонтали.
Размер окна по горизонтали должен быть таков, чтобы строка могла поместиться в окне. Если строка не может поместиться, то ее можно обрезать по границе последнего помещающегося слова, или последней помещающейся буквы, если строка не имеет пробелов.
 smile  
PM MAIL ICQ   Вверх
_hunter
Дата 17.5.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



и что советовать?
могу посоветовать использовать MFC... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Valeria
Дата 17.5.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



в смысле, какие использовать функции, а как я уже разберусь!  smile  
PM MAIL ICQ   Вверх
_hunter
Дата 17.5.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



их много... спашивай что именно нужно.
для начала: DrawText и GetTextMetrics 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
sergejzr
Дата 17.5.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Модератор: Название темы должно отражать ее суть! 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Helicopterr
Дата 18.5.2006, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: нет
Всего: 3



Valeria
Код
//будет читать строку (символы до первого пробела) из myread.dat
//пример - вызов с консоли: C:\ThisProgName myread.dat

int main(int argc, char* argv[])
{        
    FILE* in = fopen(argv[1], "r+");  
    if (!in) printf("%s", "Не найден файл, парень!");    
    char MyString [100];
    fscanf( in, "%s", MyString );    
    fclose(in);
    printf("\n\t\t%s", MyString);//выравниваем по экрану
    getch();

    return 0;
}


размеры окна и его положения - это легко, a что касается переноса строки - придется делать отдельную ф-цию, которая будет вставльть символы \n. Не справишься - пиши.

Цитата(_hunter)
могу посоветовать использовать MFC... 

При чем тут MFC?...   

Это сообщение отредактировал(а) Helicopterr - 18.5.2006, 02:41


--------------------
people can fly
PM MAIL   Вверх
_hunter
Дата 18.5.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Цитата(Helicopterr @  18.5.2006,  02:40 Найти цитируемый пост)
При чем тут MFC?...   

при том, что
Цитата
Посоветуйте с программой


к тому же: при чем тут консоль? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
GremlinProg
Дата 18.5.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Оба правы: консоль, для запроса, после чего виндовое окошко. Для окошка достаточно чистой апешки, которую генерит среда.

Функций не много:

DrawText c флагами DT_CALCRECT|DT_VCENTER|DT_CENTER|DT_SINGLELINE - чтобы получить прямоугольник, в который можно вписать строку
AdjustWindowRectEx - чтобы получить размер самого окна из этого прямоугольника
SetWindowPos - чтобы переместить окно в нужную точку

в консольном приложении нужно организовать цикл обработки очереди сообщений, но это уже после запрса с консоли. Окошко как создать, надеюсь писать не надо, по форуму много информации на эту тему. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 18.5.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Спасибо большое всем! 
Просто последний раз этим занималась на втором курсе, сейчас на последнем, а работаю в Делфи.
А написать надо быстро, поэтому решила спросить, чтобы в МСДН не лазить. smile  
PM MAIL ICQ   Вверх
Valeria
Дата 18.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Helicopterr чего-то не очень у меня получилось запустить smile 
Выдал ошибку Debug Assertion Failed! это с чем связано?Написала в консоле в Visual C++,запустила так,как написано. 
PM MAIL ICQ   Вверх
Valeria
Дата 19.5.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



GremlinProg, а вот не очень понятно. Писать в консольном приложении? что-то типа приведенного выше,да (см. Helicopterr)?
а вот по поводу окошка? как его оттуда потом запускать? в смысле это приложение уже Win32 Application. а не Console. smile 

 
PM MAIL ICQ   Вверх
_hunter
Дата 19.5.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



в смысле? откуда "оттуда"? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
GremlinProg
Дата 19.5.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



пишешь обычное консольное приложение, но подключаешь хидер windows.h.
после запроса с консоли строки, которую нужно показать в окошке, нужно создать окно и завести цикл. 

Чтобы не особо заморачиваться, открой среду и создай два приложения: консольное и виндовое. По умолчанию тебе сгенерируются два проекта в виндовом - скопируй все что в нем находится(это файл, в котором _tWinMain или просто WinMain) и перенеси его в консольное приложение, в файл, где определена функция main. у тебя получится смешанное приложение. все, что находится в WinMain перенеси в main, а WinMain удали. Далее тебе понадобится параметр HINSTANCE hInstance из WinMain, в main, такого нет, используй взамен GetModuleHandle(NULL), для exe'шника - это то же самое. после этого тебе остается вначале main вставить пару строк с запросом строки с консоли, а в WndProc добавить прорисовку строки на все окно. Строку сделай глобальной, чтобы опять же, не заморачиваться. Размер окна можно установить сразу после его создания: после удачного вызова InitInstance, только переправь её так, чтобы она возвращала дескриптор окна, а не BOOL; либо в WndProc на сообщение WM_CREATE.

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

Да, хидер windows.h желательно довавить в stdafx.h. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Helicopterr
Дата 19.5.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: нет
Всего: 3



Valeria
так как ты написала так и сделал
Цитата

Программа должна открывать текстовый файл, имя которого указывается с командной строки...

делаешь в Visual C++ ехе-ху из моего кода. Сразу её не запускаешь.  Копируешь её на диск С вместе с файлом myread.dat из которого будем читать строку. Потом в командной стрке (в Windows XP это Пуск->Выполнить) пишешь: C:\ThisProgName myread.dat
ThisProgName - это то, как ты назвала эту программу.
Вобщем незнаю, у меня работает.
 


--------------------
people can fly
PM MAIL   Вверх
GremlinProg
Дата 19.5.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Кстати MSDN читать полезно даже когда пишешь для дяди Борланда. В делфи много умного придумали, но не все по-человечески ) 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
jonie
Дата 19.5.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GremlinProg
Дата 19.5.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



если данная программа - это какое-то задание, то такой ответ jonie не пойдет. Можно только отметить твою находчивость, но ни чего более )

Добавлено @ 21:09 
а цикл в любом диалоге - свой, только скрытый от глаз программиста 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 19.5.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



GremlinProg,  smile ты меня совсем запутал, но попробую сделать так. а МСДН я частенько открываю, когда надо, на работе.
просто сейчас надо за неделю написать!а вы быстрее мне поскажете, чем в МСДН рыться! smile   
PM MAIL ICQ   Вверх
GremlinProg
Дата 19.5.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



да все нужные функции я вроде бы перечислил, смотри выше, самый превый мой пост. Ход работы тоже объяснил. Больше ни чего не надо. Консольное приложение - конечный результат.
Это что за задание-то такое на "испытательный срок" что ли?

Кого ж тут еще путать, а на деле - просто будет, сама увидишь. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 19.5.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Helicopterr, у меня все равно таже ошибка!?уж и не знаю почему, все так же делала. smile

Добавлено @ 21:45 
GremlinProg, да это тестовое, только не на испытательный срок,а типа на курсы в фирму, после которых могут взять на работу. лучших,естественно. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 19.5.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



попробуй так в 9 строке:

fscanf( in, "%s", (char*)MyString );

Добавлено @ 21:53 
тогда мой вариант делай, по заданию оно как-то логичнее получается, сделай пока чтобы просто консоль появлялась, а затем простое окно, потом остальное доделаешь

Добавлено @ 21:55 
стой, можно проще 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 19.5.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата

fscanf( in, "%s", (char*)MyString );

все равно ошибка таже:  Program: c"\ReadFile.exe
                                           File: fscanf.c 
                                           Line:54

Добавлено @ 22:04 
а я уже так и сделала, только вот что 
ShowWindow(hWnd,nCmdShow); - второй параметр просто объявить? он же был в параметрах WinMain?
и еще CreateWindow - там есть hInstance, его как получать? GetModuleHandle(NULL);? 
PM MAIL ICQ   Вверх
GremlinProg
Дата 19.5.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



и вправду запутал по невнимательности, извиняюсь (

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

Создавай обычное Win32 приложение.
3-й параметр в WinMain - это командная строка. lpCmdLine - это и будет путь к твоему файлу. Далее извлекаешь первую строку, затем работаешь с WndProc. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 19.5.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



GremlinProg, а работа с файлами ? какие есть функции? Открыть, закрыть, читать. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 19.5.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



на WM_CREATE напиши следующее:
Код

    case WM_CREATE:{
        CREATESTRUCT&cs    = *(CREATESTRUCT*)lParam;
        RECT rw;
        // берем девайс рабочего стола
        hdc    = ::GetDC(HWND_DESKTOP);
        // вычисляем размеры текста
        SIZE sizes;
        ::GetTextExtentPoint32(hdc,lpszFirstFileString,(int)strlen(lpszFirstFileString),&sizes);
        // освобождаем девайс
        ::ReleaseDC(HWND_DESKTOP,hdc);
        // вычисляем размер окна
        ::SetRect(&rw,0,0,sizes.cx,sizes.cy);
        ::AdjustWindowRectEx(&rw,cs.style,::IsMenu(cs.hMenu),cs.dwExStyle);

        RECT rcdtop;
        ::GetWindowRect(GetDesktopWindow(),&rcdtop);
        // вычисляем позицию окна и размеры
        LONG
            // размеры самого окошка
            wcx    = (rw.right - rw.left),
            wcy    = (rw.bottom - rw.top),
            // размеры рабочего стола
            dcx    = (rcdtop.right - rcdtop.left),
            dcy    = (rcdtop.bottom - rcdtop.top),
            // позиция окошка на рабочем столе
            wx    = rcdtop.left + (dcx - wcx) / 2,
            wy    = rcdtop.top + (dcy - wcy) / 2;
        // устанавливаем окно в нужную позицию
        ::SetWindowPos(hWnd,0,wx,wy,wcx,wcy,SWP_NOZORDER|SWP_NOOWNERZORDER);
        break;
    }

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

самое простое - WM_PAINT:
Код

    case WM_PAINT:{
        hdc = BeginPaint(hWnd, &ps);
        RECT rc;
        ::GetClientRect(hWnd,&rc);
        ::DrawText(hdc,lpszFirstFileString,-1,&rc,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
        EndPaint(hWnd, &ps);
        break;
    }

Добавлено @ 22:35 
щас, объясню работу с файлами    

Это сообщение отредактировал(а) GremlinProg - 20.5.2006, 12:48


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 19.5.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Вот работа с файлом, только без проверок на его отсутствие и ошибки чтения. Это нужно вставить в WinMain, перед созданием окошка.
Код

    static const char error[]    = "Ошибка!";
    // открываем файл для чтения
    HANDLE hfile        = ::CreateFile(lpCmdLine,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hfile == INVALID_HANDLE_VALUE){
        lpszFirstFileString    = new char[strlen(error)+1];
        strcpy(lpszFirstFileString,error);
    }else{
        DWORD
            readed,
            // получаем размер файла
            size            = ::SetFilePointer(hfile,0,NULL,FILE_END);
        // возвращаем файловый указатель в начало
        ::SetFilePointer(hfile,0,NULL,FILE_BEGIN);
        // заводим строку lpszFirstFileString
        lpszFirstFileString    = new char[size+1];
        lpszFirstFileString[size]    = '\0';
        // считываем весь файл в lpszFirstFileString
        ::ReadFile(hfile,lpszFirstFileString,size,&readed,NULL);
        // закрываем файл
        ::CloseHandle(hfile);
        char
            // ищем первые символы '\r' или '\n' то бишь 13 или 10
            *lpszFirstR    = strchr(lpszFirstFileString,'\r'),
            *lpszFirstN    = strchr(lpszFirstFileString,'\n');
        // если они присутствуют в файле, то 
        if((lpszFirstR)||(lpszFirstN)){
            // если оба присутствуют в файле, то перекрываем ближайший к началу нулём
            if((lpszFirstR)&&(lpszFirstN))
                *min(lpszFirstR,lpszFirstN)    = '\0';
            // иначе перекрываем нулем существующий
            else if(!lpszFirstR)
                lpszFirstN    = '\0';
            else
                lpszFirstN    = '\0';
        }
        // иначе в файле только одна строка поэтому отображаем весь
    }

Нужно по хорошему удалить lpszFirstFileString перед возвращением результата функции WinMain:
Код

delete[]lpszFirstFileString;


Добавлено @ 23:11 
работа с файлами в WinApi не слишком разнообразна. Используемые в коде функции практически полностью описывают эту работу. Можешь найти описание их в MSDN'е.

Чтобы программа заработала, запусти её с командной строки, например так:
"C:\myprog.exe" "C:\text.txt"

первое - это путь к проге, второе, через пробел - путь к файлу, из которого нужно прочитать первую строку.   

Это сообщение отредактировал(а) GremlinProg - 20.5.2006, 12:50


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата
lpszFirstFileString[size]    = '\0';


вот на это ругается, l-value specifies const object!

я попробовала исправить, видимо неверно,т.к. ничего не происходит при запуске.

Добавлено @ 11:18 
окно запустилось пустое, когда убрала break в  case WM_CREATE:

Добавлено @ 11:25 
Цитата

 ::DrawText(hdc,lpszFirstFileString,-1,&rw,DT_CALCRECT|DT_VCENTER|DT_CENTER|DT_SINGLELINE); 

а еще rw - это что за переменная? RECT? 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата

вот на это ругается, l-value specifies const object!

определи lpszFirstFileString так:
Код

char* lpszFirstFileString;

без const

Цитата

 еще rw - это что за переменная? RECT? 

Я там дописал, перепроверь код 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



еще, в обработчике 2 раза функция  DrawText?! 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



lpszFirstFileString должен быть глобальной переменной и в командной строке реальный путь к файлу

Добавлено @ 11:33 
в WM_CREATE DrawText можно заменить на GetTextExtentPoint32

Добавлено @ 11:34 
только переписывать придется: для GetTextExtentPoint32 прямоугольник не нужен будет 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



вот теперь запускается, только окно совсем маленькое, и в нем печатается "ээээ",независимо от текста файла! smile  
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



значит файл не открылся, или в командной строке путь с пробелами 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 20.5.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Переправь WinMain и сообщение WM_CREATE

В WinMain я добавил обработку на ошибку открытия файла. Если файл не открывается, то в окошке будет печататься слово "ошибка!"

В WM_CREATE - изменил DrawText на GetTextExtentPoint32. Тут еще дополнительно прямоугольник корректнее вычисляется, там все подписано.

Чтобы "эээ" не было, глобальную lpszFirstFileString нужно инициализировать так при объявлении:
Код

LPSTR lpszFirstFileString = NULL;
 

Глобально - это значит над WinMain, не внутри! А удалить её нужно перед командой return, только именно перед ней, не выше, иначе в момент, когда у тебя окошко покажется, строка уже будет удалена и ни чего, кроме "ээээ" ты не увидишь! Если это не понятно, то не удаляй lpszFirstFileString вообще, т.е. не вызывай delete[]lpszFirstFileString. 

Это сообщение отредактировал(а) GremlinProg - 20.5.2006, 13:15


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Про глобально - это я понимаю. По поводу  delete[]lpszFirstFileString., то выдает ошибку,если написать эту строку. Без нее
 запускается и пишет Ошибка!, значит файл не прочитать. А запускать надо с полным путем и в кавычках?Хотя я уже пробовала по-всякому, все равно ошибка. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



lpCmdLine замени на __argv[1]

Добавлено @ 14:18 
теперь просто брось любой текстовый файл на exe'шник, не обязательно с командной строки. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



 'WinMain' : function cannot be overloaded - не работает. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



в lpCmdLine находится путь к файлу, только в двойных кавычках, поэтому CreateFile не понимает его, а в __argv[1] эти кавычки отсекаются и все работает

Добавлено @ 14:26 
ты чего-то намудрила, не в параметрах функции  lpCmdLine замени, а в вызове CreateFile:
Код

HANDLE hfile        = ::CreateFile(__argv[1],GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);


Добавлено @ 14:28 
в WinMain верни все обратно, как было:
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow) 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



я попробовала явно указать имя файла в функции Create, аналогично - ошибка.

Добавлено @ 14:37 
вот, написала все также! все равно. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



пропиши явно, только писать надо через двойной слеш: "C:\\Folder\\Program.exe" 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



ну я так и писала! ошибка! smile  
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



боже ж ты мой
Код

// qsdasdaqwd.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <stdio.h>
#include "qsdasdaqwd.h"
#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name

// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

char*lpszFirstFileString = NULL;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    static const char error[]    = "Ошибка!";
    HANDLE hfile        = ::CreateFile(__argv[1],GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hfile == INVALID_HANDLE_VALUE){
        lpszFirstFileString    = new char[strlen(error)+1];
        strcpy(lpszFirstFileString,error);
    }else{
        DWORD
            readed,
            // получаем размер файла
            size            = ::SetFilePointer(hfile,0,NULL,FILE_END);
        // возвращаем файловый указатель в начало
        ::SetFilePointer(hfile,0,NULL,FILE_BEGIN);
        // заводим строку lpszFirstFileString
        lpszFirstFileString    = new char[size+1];
        lpszFirstFileString[size]    = '\0';
        // считываем весь файл в lpszFirstFileString
        ::ReadFile(hfile,lpszFirstFileString,size,&readed,NULL);
        // закрываем файл
        ::CloseHandle(hfile);
        char
            // ищем первые символы '\r' или '\n' то бишь 13 или 10
            *lpszFirstR    = strchr(lpszFirstFileString,'\r'),
            *lpszFirstN    = strchr(lpszFirstFileString,'\n');
        // если они присутствуют в файле, то 
        if((lpszFirstR)||(lpszFirstN)){
            // если оба присутствуют в файле, то перекрываем ближайший к началу нулём
            if((lpszFirstR)&&(lpszFirstN))
                *min(lpszFirstR,lpszFirstN)    = '\0';
            // иначе перекрываем нулем существующий
            else if(!lpszFirstR)
                lpszFirstN    = '\0';
            else
                lpszFirstN    = '\0';
        }
        // иначе в файле только одна строка поэтому отображаем весь
    }

    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_QSDASDAQWD, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_QSDASDAQWD);

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    delete[]lpszFirstFileString;
    return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX); 

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, (LPCTSTR)IDI_QSDASDAQWD);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = (LPCTSTR)IDC_QSDASDAQWD;
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND    - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY    - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message) 
    {
    case WM_CREATE:{
        CREATESTRUCT&cs    = *(CREATESTRUCT*)lParam;
        RECT rw;
        // берем девайс рабочего стола
        hdc    = ::GetDC(HWND_DESKTOP);
        // вычисляем размеры текста
        SIZE sizes;
        ::GetTextExtentPoint32(hdc,lpszFirstFileString,(int)strlen(lpszFirstFileString),&sizes);
        // освобождаем девайс
        ::ReleaseDC(HWND_DESKTOP,hdc);
        // вычисляем размер окна
        ::SetRect(&rw,0,0,sizes.cx,sizes.cy);
        ::AdjustWindowRectEx(&rw,cs.style,::IsMenu(cs.hMenu),cs.dwExStyle);

        RECT rcdtop;
        ::GetWindowRect(GetDesktopWindow(),&rcdtop);
        // вычисляем позицию окна и размеры
        LONG
            // размеры самого окошка
            wcx    = (rw.right - rw.left),
            wcy    = (rw.bottom - rw.top),
            // размеры рабочего стола
            dcx    = (rcdtop.right - rcdtop.left),
            dcy    = (rcdtop.bottom - rcdtop.top),
            // позиция окошка на рабочем столе
            wx    = rcdtop.left + (dcx - wcx) / 2,
            wy    = rcdtop.top + (dcy - wcy) / 2;
        // устанавливаем окно в нужную позицию
        ::SetWindowPos(hWnd,0,wx,wy,wcx,wcy,SWP_NOZORDER|SWP_NOOWNERZORDER);
        break;
    }
        
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:{
        hdc = BeginPaint(hWnd, &ps);
        RECT rc;
        ::GetClientRect(hWnd,&rc);
        ::SetBkMode(hdc,TRANSPARENT);
        ::DrawText(hdc,lpszFirstFileString,-1,&rc,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
        EndPaint(hWnd, &ps);
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;
}

только что проверил - РАБОТАЕТ! 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



smile Заработало!!!!!!
Благодарности нет предела!!!!

GremlinProg, СПАСИБО ОГРОМНОЕ!!!

Добавлено @ 15:02 
Просто там с файлом было неправильно!Который читаю!

Добавлено @ 15:09 
Только теперь еще надо доделать,чтобы строка обрезалась,если она в окне не помещается. 

Это сообщение отредактировал(а) Valeria - 20.5.2006, 15:01
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



это просто, посмотри, что я тут переделал:
Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message) 
    {
    case WM_CREATE:{
        CREATESTRUCT&cs    = *(CREATESTRUCT*)lParam;
        RECT rw;
        // берем девайс рабочего стола
        hdc    = ::GetDC(HWND_DESKTOP);
        // вычисляем размеры текста
        SIZE sizes;
        ::GetTextExtentPoint32(hdc,lpszFirstFileString,(int)strlen(lpszFirstFileString),&sizes);
        // освобождаем девайс
        ::ReleaseDC(HWND_DESKTOP,hdc);
        // вычисляем размер окна
        ::SetRect(&rw,0,0,sizes.cx,sizes.cy);
        ::AdjustWindowRectEx(&rw,cs.style,::IsMenu(cs.hMenu),cs.dwExStyle);
        ::OffsetRect(&rw,-rw.left,-rw.top);
        RECT rcdtop;
        ::GetWindowRect(GetDesktopWindow(),&rcdtop);
        LONG
            // размеры самого окошка
            wcx    = (rw.right - rw.left),
            wcy    = (rw.bottom - rw.top),
            // размеры рабочего стола
            dcx    = (rcdtop.right - rcdtop.left),
            dcy    = (rcdtop.bottom - rcdtop.top);
        // проверка на ширину окошка: если оно больше ширины рабочего стола, значит оно будет ему приравниваться
        if(wcx > dcx)
            wcx    = dcx;
        // вычисляем позицию окна
        LONG
            // позиция окошка на рабочем столе
            wx    = rcdtop.left + (dcx - wcx) / 2,
            wy    = rcdtop.top + (dcy - wcy) / 2;
        // устанавливаем окно в нужную позицию
        ::SetWindowPos(hWnd,0,wx,wy,wcx,wcy,SWP_NOZORDER|SWP_NOOWNERZORDER);
        break;
    }
        
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:{
        hdc = BeginPaint(hWnd, &ps);
        RECT rc;
        ::GetClientRect(hWnd,&rc);
        ::SetBkMode(hdc,TRANSPARENT);
        ::DrawText(hdc,lpszFirstFileString,-1,&rc,DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
        EndPaint(hWnd, &ps);
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Valeria
Дата 20.5.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Здорово! а я почему-то стала переделывать вторую функцию!а там сразу возникли проблемы с локальными переменными (размерами окна),
короче ничего не получилось естественно.
Спасибо тебе большое!
Видимо, сильно я все забыла за 3 года, да в принципе и не особо я им занималась тогда. Только курсовые и лабораторные. 
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Ну, это не предел мечтаний, но сойдёть для начала. Незачто! 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1032 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.