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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте с программой, небольшое приложение 
V
    Опции темы
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   Вверх
Страницы: (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.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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