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

Поиск:

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


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

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