КИТА unofficial
Апрель 19, 2024, 04:48:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 2 3 [Все]   Вниз
  Печать  
Автор Тема: WinAPI в C++  (Прочитано 87252 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« : Июль 29, 2008, 11:37:40 »

Предлагаю в этой теме задавать вопросы по сабжу. Но для начала скажу несколько слов тем, кто только планирует изучать WinAPI.

Пересмотрев около десятка книг для начинающих, я выделил для себя только 3, действительно написанные на "русском" языке Улыбка

  • П.Румянцев - Азбука программирования в Win32 API
  • Ч.Петзолд - Программирования для Win95
  • К.Финогенов - Win32. Основы программирования (2006)

Книга Румянцева по большей степени дублирует главы и примеры из книги Петзолда, но только более подробно и "разжевано". Требуется предварительное знание языка С, и основ ООП. Поэтому если Вы до этого писали лишь консольные приложения на С/С++ и хотите начать писать под Windows, то книга Румянцева или Петзолда безусловно для Вас.

К.Финогенов основательно подошел к написанию книги, и начал с архитектуры процессоров и довольно подробным описанием используемых IDE. Также имеется целая глава, посвященная синтаксису стандартного языка С++. И только с 4-ой главы начинается изучение WinAPI. Поэтому, если с языком С/С++ Вы знакомы поверхностно, эта книга станет для Вас хорошим учителем.


Полезные ссылки:

« Последнее редактирование: Октябрь 12, 2009, 08:59:22 от artem90 » Записан
Магнетон Бора
ЖИЗНЬ - БАЯН
Cтудент
*

Карма: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 61



« Ответ #1 : Апрель 22, 2009, 02:37:45 »

Доброе время суток, уважаемые форумчане )))

Есть такое дело... Делаю программу с помощью WinApi и у меня есть елемент управления ComboBox, а точнее их 2. Я их использую в диалоговом окне и прописываю в файле ресурсов. У меня в них хранятся ЧИСЛА вот вопрос как бы мне число оттуда вытащить и запомнить как ЧИСЛО, а не строку. Пробовал делать так:

Вот небольшой фрагмент диалоговой функции, но тут какой-то баг и я никак не пойму в чем дело (((

Код:
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
nItem = SendMessage(hCombo1,CB_GETCURSEL,0,0);
wx = atoi(SendMessage(hCombo1,CB_GETITEMDATA,nItem,0));
nItem = SendMessage(hCombo2,CB_GETCURSEL,0,0);
wy = atoi(SendMessage(hCombo2,CB_GETITEMDATA,nItem,0));

case IDCANCEL: break;
};
}
break;

Кто-нибудь может предложить вариант получения информации из этого элемента управления?  Крутой  Улыбка

З. Ы. Заранее благодарен  Улыбка
Записан
ZaQ
Бакалавр
**

Карма: +6/-1
Offline Offline

Пол: Мужской
Сообщений: 128



« Ответ #2 : Апрель 27, 2009, 09:42:25 »

А конвертнуть строку в число религия не позволяет???
Чето я невнимательно читаю, пора спать Улыбка. Ищи ошибку, читай МСДН.
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #3 : Июнь 03, 2009, 09:15:20 »

В программе создается поток, приостановка и продолжение работает.
НО если попытаться завершить его, то заново запустить не получается ...
На завершение выполняю
Цитировать
potok1.stop=1;
TerminateThread(potok1.hpotok,potok1.exitcode);
На запуск пробовал делать
Цитировать
potok1.hpotok=CreateThread(NULL,0,ThreadFunc_1,(PVOID)(&potok1),CREATE_SUSPENDED,&potok1.per_potok);
potok1.hWndPot=hWndChild;
potok1.stop=0;
ResumeThread(potok1.hpotok);
Не получается ... все равно не запускает поток ... точнее оно вроде как запускает его тк ошибок не выдает, но тот прямоугольник что должен двигаться вообще не появляется ... т е не прорисовывается ...
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
AlexXxandr
Гость
« Ответ #4 : Июнь 05, 2009, 05:09:40 »

Нужно сделать так чтобы по WaitableTimer'у звучал сигнал Beep
Вот как я делаю:
Код:
VOID CALLBACK TimerAPCProc(LPVOID, DWORD, DWORD);
HANDLE hWTimer;
SYSTEMTIME st;
FILETIME ftLocal, ftUTC;
LARGE_INTEGER liUTC;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,int nCmdShow){
//--------------------ТАЙМЕР--------------------------------------------------------------
// создаем таймер с автосбросом
hWTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// узнаем текущую дату/время
GetLocalTime(&st);
st.wHour = 19;
st.wMinute = 34;
st.wSecond = 0;
// преобразуем время из SYSTEMTIME в FILETIME
SystemTimeToFileTime(&st, &ftLocal);
// преобразуем местное время в UTC-время
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// преобразуем FILETIME в LARGE_INTEGER из-за
// различий в выравнивании данных
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// устанавливаем таймер
SetWaitableTimer(hWTimer, &liUTC, 24*60*60*1000, TimerAPCProc, NULL, FALSE);
//---------------------------------------------------------------------------------------
}
VOID CALLBACK TimerAPCProc(LPVOID, DWORD, DWORD){
Beep(1000,500); // выдается звуковой сигнал
};
В StdAfx.h я прописал #define _WIN32_WINNT 0x0400 иначе не компилировалось.
Проблема в том что если указать текущее время, то при запуске звуковой сигнал издается, а если указать только будущее время, то он не срабатывает, как мне кажется таймер просто не считает время. Помогите, что делать?
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #5 : Июнь 05, 2009, 11:23:09 »

полные исходники - в ЗИП и приаттачь
Записан
AlexXxandr
Гость
« Ответ #6 : Июнь 06, 2009, 10:05:51 »

Лаба компилица можете запускать, кусок кода с таймером выделен в ф-и винмэин.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #7 : Июнь 07, 2009, 12:35:02 »

итак,
цитата
"TimerAPCProc вызывается из того потока, который обратился к SetWaitableTimer в момент срабаты вания таймера, — но только если вызывающий поток находится в "тревожном" (aler table) состоянии, т. e. ожидает этого в вызове одной из функций SleepEx, WaitForSingle ObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx или SignalObjectAndWait Если же поток этого не ожидает в любой из перечисленных функций, система не поставит в очередь АРС-функцию таймера. Тем самым система не даст АРС-очереди потока переполниться уведомлениями от таймера, которые могли бы впустую израсходовать колоссальный объем памяти.
Если в момент срабатывания таймера Ваш поток находится в одной из перечис ленных ранее функций, система заставляет его вызвать процедуру обратного вызова"
Записан
AlexXxandr
Гость
« Ответ #8 : Июнь 07, 2009, 12:58:50 »

Что то я не совсем понял, что мне поменять надо. Мне сеттаймер сделать в отдельный поток? Можно по проще объяснить плиз?
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #9 : Июнь 07, 2009, 01:09:43 »

угу, можно создать в отдельном потоке, а потом вызвать в нем sleep
Записан
AlexXxandr
Гость
« Ответ #10 : Июнь 07, 2009, 01:41:25 »

Создал 4ый поток при создании главного окна, поток запущенный, вот ф-я его обработки. Если раньше при установки текущей или прошедшей минуты оно срабатывало, теперь вообще не работает.
Код:
DWORD WINAPI ThreadFunc_4(PVOID pvParam){
struct  POTOK *p=(struct POTOK *)(pvParam);
static HDC hDC=GetDC(p->hWndPot);
hWTimer = CreateWaitableTimer(NULL, FALSE, NULL);
GetLocalTime(&st);
st.wHour = 13;
st.wMinute = 39;
st.wSecond = 00;
SystemTimeToFileTime(&st, &ftLocal);
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
while(!p->stop){
Sleep(1000);
SetWaitableTimer(hWTimer, (LARGE_INTEGER *)&liUTC, 24*60*60*1000, TimerAPCProc, NULL, FALSE);
}
return(0);
}
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #11 : Июнь 07, 2009, 01:51:45 »

только если вызывающий поток находится в "тревожном" (aler table) состоянии, т. e. ожидает этого в вызове одной из функций SleepEx, WaitForSingle ObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx или SignalObjectAndWait Если же поток этого не ожидает в любой из перечисленных функций, система не поставит в очередь АРС-функцию таймера.
куда уж понятнее???
Записан
AlexXxandr
Гость
« Ответ #12 : Июнь 07, 2009, 02:03:14 »

Так я итак делаю Sleep
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #13 : Июнь 07, 2009, 02:08:11 »

Итак, читаем MSDN.
Sleep Function

Suspends the execution of the current thread until the time-out interval elapses.
To enter an alertable wait state, use the SleepEx function.
понятненько?
третий раз объяснил то, что написал.
Записан
AlexXxandr
Гость
« Ответ #14 : Июнь 07, 2009, 02:15:13 »

Урааа!!!111
Я тупил т.к. я поставил SleepEx(1000,FALSE); и оно все так же не работало, но когда я поставил SleepEx(1000,TRUE); сразу заработало. Спасибо Вам большое!
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #15 : Июнь 07, 2009, 02:20:04 »

естественно, с false не работало.
DWORD WINAPI SleepEx(
  __in  DWORD dwMilliseconds,
  __in  BOOL bAlertable
);

(Отправлено в: Июнь 07, 2009, 02:18:48 )
 
Не получается ... все равно не запускает поток ...
а CloseHandle для дескриптора потока перед его пересозданием пробовал?
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #16 : Июнь 07, 2009, 09:03:47 »

а CloseHandle для дескриптора потока перед его пересозданием пробовал?
Попоже попробую, сейчас проблема в другом...

Вот пример который нам скинули
Цитировать
Примеры программ по синхронизации потоков
Критические разделы (секции)
Пример использования критического раздела.
Синхронизируется работа двух потоков при заполнении элементов массива значениями и выводе их на экран.
Код:
CRITICAL_SECTION cs;
DWORD a[5]; // Объявление глобального массива
// Функция потока 1
DWORD WINAPI ThreadFunc1(PVOID pvParam)
{ int i; DWORD dwResult = 0, num=0;
  struct PARAM *p= (struct PARAM *) pvParam;
  while (!p->stop)
  {
   EnterCriticalSection(&cs);
   for ( i = 0; i < 5; i++ ) a[ i ] = num;
   LeaveCriticalSection(&cs);
   num++;
  }
  return(dwResult);
}
// Функция потока 2
DWORD WINAPI ThreadFunc2(PVOID pvParam)
{ int i; DWORD dwResult = 0;
  struct PARAM *p= (struct PARAM *) pvParam;
  while (!p->stop)
  {
   EnterCriticalSection(&cs);
   for ( i = 0; i < 5; i++ ) printf("%ld  ", a[ i ]);
   printf("\n");
   LeaveCriticalSection(&cs);
  }
  return(dwResult);
}
// --- Функция WinMain
int APIENTRY WinMain(…)
{
  // Создание объекта критический раздел
  InitializeCriticalSection(&cs);
 …
  // Удаление объекта критический раздел (при необходимости)
  DeleteCriticalSection(&cs);
 …
}

Моя программа прикреплена
Проблема в том, что если запустить 2 или 3 поток, то другой уже не запуститься (2 или 3)
А должны как я понимаю поочереди ... смотрю в пример и не понимаю в чем ошибка ...
Пытался пример скомпилировать, он срабатывает 1 раз, т е выводит на экран 1 раз цифры, но потом вылетает ...
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #17 : Июнь 07, 2009, 09:21:58 »

начнём с того, что у тебя Sleep стоит внутри EnterCriticalSection - LeaveCriticalSection
итог - другой поток вряд ли захватит критическую секцию
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #18 : Июнь 07, 2009, 10:58:26 »

Цитировать
Текстовая строка   Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,2 сек
Прямоугольник с закругленными краями    Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек
Если он (слип) так мешает, тогда как реализовать интервал между выполнением ? Всегда его использовал ...

Просто даже сам пример 1 раз выполняет 1-й поток потом выполняет 2-й и программа вылетает ....
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #19 : Июнь 07, 2009, 11:01:41 »

ну что ж вы такие невнимательные?Непонимающий
Sleep выставь для начала из
EnterCriticalSection - LeaveCriticalSection
во внешний код
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #20 : Июнь 07, 2009, 11:17:19 »

Мне надо сделать интервал между перемещениями фигуры/текста, а не между переключением на другой поток ...
Всетаки попробовал, сделал вот так
Цитировать
while(!p->stop)
   {
      Sleep(3000);
      EnterCriticalSection(&cs);
Старый слип удалил естественно.
Теперь чтото вообще не видно ничего ... хотя когда идет остановка на 3 секунды думаю должен быть виден результат но его нету =\
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #21 : Июнь 08, 2009, 12:44:54 »

Код:
DWORD WINAPI ThreadFunc_2(PVOID pvParam)
{
DWORD dwRes=0;
static RECT rPopup;
static HDC hDCPopup;
struct  potok *p=(struct potok *)(pvParam);
static UINT xPosE,yPosE;
static int flag=0;
static char str[]="Строка";
GetClientRect(p->hWndPot,&rPopup);
xPosE=((rPopup.right-rPopup.left)-50)/2.;
yPosE=((rPopup.bottom-rPopup.top)-30)/2.;
while(!p->stop)
{
hDCPopup=GetDC(p->hWndPot);
EnterCriticalSection(&cs);
while(count1<1)
{
InvalidateRect(p->hWndPot,NULL,true);
UpdateWindow(p->hWndPot);
TextOut(hDCPopup,xPosE,yPosE,str,7);
if(yPosE+40>=rPopup.bottom-rPopup.top)
flag=1;
if(yPosE<=40)
flag=0;
if(flag)
yPosE-=10;
else
yPosE+=10;
count1++;
}
count1=0;
ReleaseDC(p->hWndPot,hDCPopup);
LeaveCriticalSection(&cs);
Sleep(500);
}
return dwRes;
}

DWORD WINAPI ThreadFunc_3(PVOID pvParam)
{
DWORD dwRes=0;
static RECT rPopup;
static HDC hDCPopup;
struct  potok *p=(struct potok *)(pvParam);
static UINT xPosE,yPosE;
static int flag=1;
GetClientRect(p->hWndPot,&rPopup);
xPosE=0;
yPosE=0;
while(!p->stop)
{
hDCPopup=GetDC(p->hWndPot);
EnterCriticalSection(&cs);
while(count2<1)
{
InvalidateRect(p->hWndPot,NULL,true);
UpdateWindow(p->hWndPot);
RoundRect(hDCPopup,xPosE,yPosE,xPosE+70,yPosE+50,30,30);

if(xPosE+100>=rPopup.right || yPosE+5<=rPopup.top)
flag=0;

if(xPosE<=rPopup.left+10 || yPosE+55>=rPopup.bottom)
flag=1;

if(flag)
{
xPosE+=40;
yPosE+=30;
}
else
{
xPosE-=40;
yPosE-=30;
}
count2++;
}
count2=0;
ReleaseDC(p->hWndPot,hDCPopup);
LeaveCriticalSection(&cs);
Sleep(500);
}
return dwRes;
}
отличия от своего ищи сам.
код рабочий
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #22 : Июнь 08, 2009, 12:25:13 »

Отличия я заметил, спасибо все работает, в принципе ошибку понял, НО видимо вы невнимательно читали мои сообщения.
Мне надо сделать интервал между перемещениями фигуры/текста, а не между переключением на другой поток ...
Т е Слип должен быть в цикле while(count2<10){ ... }
Если разместить его так как вы предлогаете, то у меня будет остановка между переключением на другой поток...
А если размещать Слип в цикле while(count2<10){ ... } то получаем старую проблему, выполняется постоянно поток, который запущен первым.

Мне надо чтобы текст сдвинулся 8 раз с интервалом допустим 0,5 сек, потом переключился на другой поток и прямоугольник сдвинулся 10 раз с интервалом 0,4 сек.
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #23 : Июнь 08, 2009, 12:31:28 »

а слабо сделать очень маленький Sleep после LeaveCriticalSection чтоб другой поток успел войти?
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #24 : Июнь 08, 2009, 12:38:10 »

Т к интервал должен быть между перемещением фигуры/текста, то и слип должен быть в цикле while(count2<1){...} , а следовательно внутри входа/выхода из крит. секции ...
А если его расположить не в этом цикле, т е после LeaveCriticalSection то будет выполняться моментально смещение 8 раз текста (на глаз его просто не заметишь), потом задержка, а потом будет так же быстро выполнено перемещение фигуры 10 раз ...
А мне как раз надо чтобы было видно как он делает эти 8 шагов, задержка между переключением мне вообще не нужна ...
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #25 : Июнь 08, 2009, 01:09:17 »

ещё немного, и мне выдадут предупреждение за мат.
сделай В ТОМ ЧИСЛЕ задержку ПОСЛЕ освобождения секции.
ну что непонятно???
неужели трудно самому сообразить?
Записан
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #26 : Июнь 08, 2009, 01:15:16 »

Блин теперь понял  Смеющийся
Слова "в том числе" помогли ))))))
Получается что без слипа поток просто не успевал подхватить критическую секцию и поэтому постоянно 1 выполнялся =\
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #27 : Июнь 08, 2009, 01:17:30 »

Halleluja!!!!!!!!!1
Записан
ZaQ
Бакалавр
**

Карма: +6/-1
Offline Offline

Пол: Мужской
Сообщений: 128



« Ответ #28 : Июнь 08, 2009, 07:03:15 »

да, и делай слип(1), с нулем в параметрах потоки могут драться, особенно на (псевдо)многоядерных процах.
Записан
AlexXxandr
Гость
« Ответ #29 : Сентябрь 22, 2009, 08:41:45 »

Добрый вечер всем!
Такое вот задание есть: "с использованием стандартного диалога Open определяется путь и имя исходного файла, для просмотра его содержимого необходимо вызвать редактор Notepad с передачей ему пути и имени файла"
Добавил пункт меню и в его обработку пишу:
Код:
case ID_VIEW:
// Инициализация OPENFILENAME
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hWnd;
ofn.lpstrFile=FileName;
ofn.lpstrFile[0]='\0';
ofn.nMaxFile=sizeof(FileName);
ofn.lpstrFilter="*.txt\0*.TXT\0";
ofn.nFilterIndex=1;
ofn.lpstrFileTitle=NULL;
ofn.nMaxFileTitle=0;
ofn.lpstrInitialDir="d:";
ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
[i]if (GetOpenFileName(&ofn)==TRUE)
//ЗДЕСЬ НАВЕРНО ОБРАБОТКА БЛОКНОТОМ[/i]
break;
Собственно вопросы:
1. Как запустить блокнотом нужный мне файл?
2. Как сделать стартовой папкой т.е. что передать в ofn.lpstrInitialDir чтобы открывалась текущая папка, т.е. в которой находится ехе файл.

ЗЫ может есть что почитать про работу с файлами с примерами?
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #30 : Сентябрь 22, 2009, 09:22:55 »

без обид, но MSDN тебе в помощь. нет смысла отвечать на такие глупые вопросы.
это ведь не "помогите найти ошибку". цитированием гугла заниматься не собираюсь. Гугль - твой друг
ЗЫ. я не вредный - всегда помогу в более сложной ситуации. обращайся.
Записан
AlexXxandr
Гость
« Ответ #31 : Сентябрь 22, 2009, 10:05:34 »

Хорошо и что же мне в мсдн искать? Я незнаю как это спросить у гугла даже, то что спрашивал, фигня получается...
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #32 : Сентябрь 22, 2009, 10:13:59 »

набираем OPENFILENAME и получаем шикаааарную (С) (Эрик Картман) сцылку.
http://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx
и вуаля -  LPCTSTR       lpstrInitialDir - то что нам надо!
читаем дальше
Windows 2000/XP/Vista:
 - If lpstrFile contains a path, that path is the initial directory.
 - Otherwise, lpstrInitialDir specifies the initial directory.
 - Otherwise, if the application has used an Open or Save As dialog box in the past, the path most recently used is selected as the initial      directory. However, if an application is not run for a long time, its saved selected path is discarded.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
 - Otherwise, the initial directory is the personal files directory of the current user.
 - Otherwise, the initial directory is the Desktop folder.
окей, вроде ясно.
тперь по 1 пункту.
вбиваем в поиск "параметры запуска notepad" и получаем ссылку http://forum.script-coding.info/viewtopic.php?id=2858
а теперь читаем "notepad.exe c:\file.txt"
ну, круто я пользуюсь гуглом?
ЗЫ. с тебя пиво за урок пользования гуглом.
Записан
broken-wings
wings of empathy
ЧеГеварный
Проректор
*****

Карма: +176/-6
Offline Offline

Пол: Мужской
Награды:
3 место в фотоконкурсе \За III место в фотоконкурсе \За победу в конкурсе футбольных прогнозистов \
Сообщений: 4531


Эксперт по какашкам и поиску смыслов


« Ответ #33 : Сентябрь 22, 2009, 10:25:42 »

Off-Topic - помечено автором как "не соответствует обсуждаемой теме"
tos, ты сегодня - само добро Показывает язык)))
Записан

кругом одно и то же свинство
но я умею выделять
по незначительным нюансам
спорт журналистику кино
Fr0sT
Очень добрый
Первак
*

Карма: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 45

ИУС 07


« Ответ #34 : Октябрь 08, 2009, 09:45:30 »

Вопрос по работе с файлами: открыл файл, с помощью WriteFile записал строку. В строке были символы \n\r, а в файле все данные записаны в одну строку. Как быть если нужна новая строка?
(Отправлено в: Сентябрь 24, 2009, 09:53:17 )
 Неактуально. Идея в том, что нужно \r\n а не наоборот
(Отправлено в: Сентябрь 25, 2009, 11:08:30 )
 Задание: создать текстовый файл для записи, для него создать проекцию в память, по адресу этой проекции сформировать содержимое выходного файла.
Код:
HANDLE hFile,hFileMappingCreate;

hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
hFileMappingCreate=CreateFileMapping(hFile,0,PAGE_READWRITE,0,0,0);

char* BufferWrite=(char*)MapViewOfFile(hFileMappingCreate,FILE_MAP_ALL_ACCESS,0,0,0);
strcpy(BufferWrite,"1111");
//
Вылетает на последней строке с First-chance exception in Lab2.exe: 0xC0000005: Access Violation. Где ошибся?
З.Ы. пользовался нижним примером с http://forum.vingrad.ru/articles/topic-157806.html
Записан

Видимо, какая-то постоянная величина оказалась немного переменной... (с) Йон Колфер
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #35 : Октябрь 09, 2009, 02:03:48 »

проект VS в студию.
Записан
Fr0sT
Очень добрый
Первак
*

Карма: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 45

ИУС 07


« Ответ #36 : Октябрь 10, 2009, 08:53:06 »

вот
Записан

Видимо, какая-то постоянная величина оказалась немного переменной... (с) Йон Колфер
O(o.o)O
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 1


« Ответ #37 : Октябрь 12, 2009, 08:48:31 »

Всем доброго времени суток.

Подскажите пожалуйста аналоги цункций MoveWindow и SetWindowPos.

Для чего мне это нужно: хотел написать маленькую прогу которая заставит кнопку пуск летать по экрану, вышеперечисленные функции не смогли этого выполнить (на ноуте стоит виндовс 7) , хотя под виндовс ХР все корректно отрабатывает...

Если кто-нибудь еще и объяснит почему возникла такая сложность с кнопкой Пуск буду очень благодарен.

З.ы. просьба за глупые вопросы сильно не бить, я только начал учить WinAPI...
Записан
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #38 : Июнь 18, 2010, 04:45:54 »

Люди добрые помогите пожайлуста с прогой. Может у кого есть .Переместить все файлы из одного каталога в другой с подкаталогами (реализовать в WinAPI)
Записан
Kenny
^___^
Проректор
*****

Карма: +69/-11
Offline Offline

Пол: Мужской
Награды:
3 место в фотоконкурсе \За II, III места в фотоконкурсе Вид из окна
Сообщений: 2352



WWW
« Ответ #39 : Июнь 18, 2010, 04:48:52 »

Смеющийся попробуй wget и mv для win.
Еще можно попробовать сдать powershell.
Записан
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #40 : Июнь 20, 2010, 12:13:48 »

Люди добрые помогите пожайлуста с прогой. Может у кого есть .Переместить все файлы из одного каталога в другой с подкаталогами (реализовать в WinAPI)
(Отправлено в: 19 Июнь 2010, 23:55:52)
 P.S. Очень нужно правда
(Отправлено в: 20 Июнь 2010, 00:10:59)
  Грустный Грустный Грустный Грустный Грустный Грустный
Записан
Kenny
^___^
Проректор
*****

Карма: +69/-11
Offline Offline

Пол: Мужской
Награды:
3 место в фотоконкурсе \За II, III места в фотоконкурсе Вид из окна
Сообщений: 2352



WWW
« Ответ #41 : Июнь 20, 2010, 01:01:03 »

За 2 дня можно было бы 4-5 таких лаб сделать не зная винапи. Вон из профессии :о)
Записан
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #42 : Июнь 20, 2010, 09:13:16 »

http://tinyurl.com/3y4o578
У меня все.
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #43 : Июнь 21, 2010, 01:19:36 »

Плиз
 Плачущий Плачущий Плачущий Плачущий Плачущий Плачущий
Записан
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #44 : Июнь 21, 2010, 01:46:11 »

Sanya, ответь на вопрос - у тебя что-то не получается или ты не хочешь делать? Если второе, то извини - мы тут не любим ленивых.
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #45 : Июнь 21, 2010, 02:57:41 »

Ситуация такая у нас по СИСПО ассемблер и WinAPI C++. По ассемблеру нам хоть что то дали на лекциях и практике, а по WinAPI ничего да и само задание выложили 2 недели назад. Я просто физически не успеваю разобраться в WinAPI.
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #46 : Июнь 21, 2010, 03:05:16 »

ну-ну  nea
Записан
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #47 : Июнь 21, 2010, 03:10:24 »

Sanya, я выше дал ссылку. Пример решения твоей задачи находится в Гугле за 10 минут. Еще час потратишь на проверку и понимание кода (он зачастую с комментариями). Так что было бы желание.
Записан

"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
Kenny
^___^
Проректор
*****

Карма: +69/-11
Offline Offline

Пол: Мужской
Награды:
3 место в фотоконкурсе \За II, III места в фотоконкурсе Вид из окна
Сообщений: 2352



WWW
« Ответ #48 : Июнь 21, 2010, 03:13:34 »

Ситуация такая у нас по СИСПО ассемблер и WinAPI C++. По ассемблеру нам хоть что то дали на лекциях и практике, а по WinAPI ничего да и само задание выложили 2 недели назад. Я просто физически не успеваю разобраться в WinAPI.
Ну да, главное чтобы на пивко и погулять время было. Без обид.
Записан
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #49 : Июнь 21, 2010, 03:20:44 »

Во первых я непью и не дебоширю. А во вторых ссесия это не только СИСПО
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #50 : Июнь 21, 2010, 03:25:56 »

Ну, рассказывай, что ты весь семестр ишачил, а учебная программа такая сложная, что всё равно не успел. Подзатыльник
Но лучше расскажи своей бабушке или маме - они может и пожалеют "да, нынче учёба - лишь бы деньги выкачать"
Записан
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #51 : Июнь 21, 2010, 03:31:51 »

Ну это смотря где учиться. А по поводу "да, нынче учёба - лишь бы деньги выкачать" с нашем факультетом не пройдет проверенно времинем.
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #52 : Июнь 21, 2010, 03:33:46 »

короче, пока ты регистрировался и плакался на форуме, мог бы написать половину лабы.
в инете по 1 ссылке Alder'а есть готовая функция.
Записан
Sanya
Абитуриент


Карма: +0/-0
Offline Offline

Сообщений: 7


« Ответ #53 : Июнь 21, 2010, 03:38:55 »

Да функция это не такая проблема. Проблема в с Win-приложением, не получается много стандартных вещей
Записан
tos
Mодератор
Декан
*****

Карма: +80/-16
Offline Offline

Награды:
1 место в фотоконкурсе \1,3 место в фотоконкурсе \II место в фотоконкурсе \
Сообщений: 1949


♪♪ ♫Nice boys don`t play Rock`n`Roll♫ ♪♪


« Ответ #54 : Июнь 21, 2010, 03:41:51 »

Все лабы делаются на основе лабораторной работы #1.
Вы её выполняли?
Вот Вам в помощь - http://msdn.microsoft.com/en-us/default.aspx
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6133


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #55 : Июнь 25, 2010, 11:27:42 »

Sanya, помнится проходил я интервью при приеме на работу в одной конторе. Мои знания WinAPI на тот момент были примерно такие же как у тебя. Я знал что WinAPI есть и что он позволяет много чего делать. И все.

Мне дали довольно объемное тестовое задание именно по WinAPI с формулировкой - принести готовое приложение на следующий день. Одной, всего лишь одной из нескольких частей этого задания было тоже что у тебя. У меня на все это задание, то есть на то, что бы разобраться с нуля как вообще делать приложения с помощью WinAPI, плюс как сделать конкретно те вещи, которые требовались (а там были вещи и посложнее) ушло часов 5. При этом интернета у меня дома не было тогда, единственным источником, которым я пользовался был MSDN.

Так что хватит ныть, а бери и разбирайся. Там все легко.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.135 секунд. Запросов: 38.