Win API

Тема в разделе "WASM.BEGINNERS", создана пользователем Mark, 30 дек 2011.

  1. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    Mark
    если файла нет, то как его можно открыть? естесно функция возвращает ошибку, обрабатывай возвращаемое значение.
    элементарная логика, Mark
     
  2. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    moderhi

    Если файла не было, то я так думаю, поле бы было пустым ((
     
  3. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    И с файлом тоже крокозябра. Не пойму. Поможете открыть файл и поместить содержимое в буфер?
     
  4. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Код (Text):
    1. #include <Windows.h>
    2. #include <iostream>
    3.  
    4. int main()
    5. {
    6.     HANDLE file = CreateFileA("D:\\File.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, NULL, NULL);
    7.     CHAR fileData[256];
    8.  
    9.     if(file != INVALID_HANDLE_VALUE)
    10.     {
    11.         DWORD readed;
    12.  
    13.         ReadFile(file, fileData, 255, &readed, NULL);
    14.  
    15.         fileData[readed] = '\0';
    16.     }
    17.  
    18.  
    19.     std::cout << fileData;
    20. }
     
  5. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    Mark
    ну открывать ты умееш(CreateFile) помещать в буфер win api- ReadFile. параметры читай vsokovikov.narod.ru там на русском понятно все переведено.
     
  6. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    moderhi

    Вот собрал. Только в поле ничего нет. Пусто. Файл есть. Не пойму, в чем дело.

    Код (Text):
    1. HANDLE file = CreateFileA("Zametky.txt",
    2.                             GENERIC_READ | GENERIC_WRITE,
    3.                             FILE_SHARE_READ,
    4.                             NULL,
    5.                             OPEN_EXISTING,
    6.                             FILE_FLAG_OVERLAPPED,
    7.                             NULL);
    8.    char fileData[256];
    9.  
    10.    
    11.         DWORD readed;
    12.  
    13.         ReadFile(file, fileData, 255, &readed, NULL);
    14.  
    15.         fileData[readed] = '\0';
    16.    
    17.    
    18.  
    19.     hWnd = CreateWindow("edit", fileData,
    20.                         WS_VISIBLE | WS_CHILD | WS_HSCROLL | WS_VSCROLL | ES_NOHIDESEL | ES_MULTILINE | ES_AUTOVSCROLL | ES_LEFT,
    21.                         0,
    22.                         0,
    23.                         300,
    24.                         500,
    25.                         hwnd,
    26.                         (HMENU)12,
    27.                         hInstance,
    28.                     NULL);
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Функция GetDlgItemText() сама поставит ноль в конце текста.
    А в файл надо писать по значению возвращённому GetDlgItemText():
    Код (Text):
    1. CHAR buf[200];
    2. int nChars = GetDlgItemTextA ();
    3. ...
    4. DWORD dw;
    5. WriteFile (f, buf, nChars, &dw, 0);
    Без отладчика выходит только топтание на месте.
    Тебе совет: учи отладчик - это просто.

    Если просто надо длина текста, то вызови lstrlenA(buf);
    Вернётся то же значение, что и GetDlgItemTextA().

    По отладчику:

    1. На той линии кода, где нужна остановка -- ставим курсор и жмём F9.
    Появится красная метка на левой стороне. Если метка более не нужна -- опять
    курсор на линию -- и снова F9. Метка убирается.

    2. Нажимаем F5 -- код запустится обычным образом, но если выполнение
    попадёт на линию с меткой -- код остановится и тогда курсор ставим на
    переменную (например: fileData) и ждём 1 секунду -- появится содержимое этой
    переменной.

    3. Если надо пройти по каждой линии кода -- нажимаем F10 последовательно.
    F11 -- отладчик "зайдёт" в функцию (если для неё есть информация об отладке).

    4. Если надо оставить отладку и опять выполняться без остановок -- снова F5.
     
  8. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Спасибо, посмотрел. Успешно получилось сделать вывод записанных символов.

    Но хотел спросить, так можно делать (?):
    Код (Text):
    1. DeleteFile ("Zametky.txt");
     
  9. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Или его сначала открыть надо??
     
  10. Clickgg

    Clickgg New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2011
    Сообщения:
    32
    Mark
    h**p://progbook.ru/c/713-hart-sistemnoe-programmirovanie-v-srede-windows.html
    вот скачай нормальная книга и почитай а лучше закажи или сходи в книж и купи...
    а вообще че ты мелочишься? бери сразу и дрова пиши
     
  11. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Clickgg

    Жесткий плохой был.
     
  12. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Файлы удаляются без открывания.
     
  13. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Вот создал диалог. Главное окно открывается, диалога нет. Вот создание диалога:

    Код (Text):
    1. char pop[] = "Dialog";
    2. CreateDialogA(hInst, pop, hwnd, About);
    Вот процедура обработки:


    Код (Text):
    1. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    2. {
    3.     UNREFERENCED_PARAMETER(lParam);
    4.     switch (message)
    5.     {
    6.     case WM_INITDIALOG:
    7.         return (INT_PTR)TRUE;
    8.  
    9.     case WM_COMMAND:
    10.         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    11.         {
    12.             MessageBeep(0);
    13.             EndDialog(hDlg, LOWORD(wParam));
    14.             return (INT_PTR)TRUE;
    15.         }
    16.         break;
    17.     }
    18.     return (INT_PTR)FALSE;
    19. }
    VS не ругается, но диалога нет. Не подскажите в чем дело?
     
  14. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Да, и еще хотел спросить. В гугле, Яндексе искал, не нашел. Как изменить громкость с помощью ползунка? (И как создать ползунок)

    Единственное нарыл: Изменение громкости SetVolume();
    Только компилятор ее не знает. Подключил mmsystem.h - все равно
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Mark
    Про громкость - не знаю.
    А что в файле .RC по поводу диалога?

    Должен быть диалог ресурс с таким именем.
    Кстати, DIALOG - это ключевое слово для .RC - поэтому лучше изменить название - например: "MyDialog".

    А ещё вернее назвать диалог не именем а просто номером, например:
    201 DIALOG ...
    ...

    и далее вызвать вот так:
    Код (Text):
    1. DialogBoxA(hInst, (LPCTSTR)201, hwnd, About);
    Кстати, а почему "А" - лучше было бы: "CreateDialogW".

    И ещё: есть модальные диалоги и не-модальные.
    "CreateDialog" создаёт не-модальный диалог, т.е. такой, который не задерживает выполнение
    следующих за ним строк кода. Кроме того, для не-модальных диалогов нужен специальный код
    в цикле обработки сообщений (читай про: "IsDialogMessage").

    Попробуй "DialogBoxParamW" - это будет модальный диалог.
     
  16. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    А поможете найти ошибку? Иногда копирует после текста крокозябры, и копирует без ENTER'ов.

    Код (Text):
    1. FILE *fol;
    2. fol = fopen("Zametky.txt", "rw+");
    3.    
    4. char lol[1000];
    5.    
    6.      
    7. fread(&lol, sizeof(lol), 2, fol);
     
  17. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Код (Text):
    1. fread(lol,sizeof(lol),1,fol)
     
  18. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Sholar

    А какая функция читает С ENTER'ами? А то, эта без них.
     
  19. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  20. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

    Спасибо большое)