Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

global variable

45K
07 декабря 2009 года
rookie
21 / / 15.10.2009
Доброго времени суток товарищи!
Загружаю фотку вот таким способом:
Получения имени и пути к изображению
UINT OpenFileFromDialog(HWND hWnd, OPENFILENAME ofn, RECT rect)
{
char szFile[300];
szFile[0] = 0;
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "*.image files\0 ";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn)==TRUE)
{
USES_CONVERSION;
lpsname = T2W(ofn.lpstrFile);
::GetClientRect(hWnd, &rect);
::InvalidateRect(hWnd,&rect,TRUE);
SendMessage(hWnd, 0x000f,0,0);
}
else return 0;
return 1;
}
Показываю изображение в wm_paint
void LoadImageFile(HDC hDC, HWND hWnd, RECT rect, LPWSTR lpsName)
{
UINT WidthW, HeigthW;
::GetClientRect(hWnd, &rect);
WidthW = rect.right;
HeigthW = rect.bottom;
Graphics *graphics = new Graphics(hDC);
Image *image = new Image(lpsName,TRUE);

graphics->DrawImage(image, 0,0,WidthW,HeigthW);

delete image;
delete graphics;
}

Дело в том, что когда я открываю ее первый раз она нормально загружается, а когда я изменяю размер окна, то в глобалной переменной где хранится имя и путь к фалу совсем непонятное мне значение.
7
07 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
А что за глобальная переменная?char szFile[300] которая?
87
07 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: @pixo $oft
А что за глобальная переменная?char szFile[300] которая?



Вероятно, lpsname.

Надо ещё посмотреть на то, как LoadImageFile вызывается. Узнать, как автор темы узнает, что в строке непонятное значение. Немного OPENFILENAME ofn смущает, которое передается по значению.

45K
08 декабря 2009 года
rookie
21 / / 15.10.2009
Цитата: @pixo $oft
А что за глобальная переменная?char szFile[300] которая?


Очень смешно!

lpsname - глобальная переменная,
как узнаю? ну либо textout(), либо messagebox.

87
08 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: rookie
как узнаю? ну либо textout(), либо messagebox.



Не очень удобно, но ладно. Так какую переменную заносишь в MessageBox? lpsname или lpsName? Вообще, покажи как смотришь.

45K
10 декабря 2009 года
rookie
21 / / 15.10.2009
Цитата: Kogrom
Не очень удобно, но ладно. Так какую переменную заносишь в MessageBox? lpsname или lpsName? Вообще, покажи как смотришь.


Код:
void LoadImageFile(HDC hDC, HWND hWnd, RECT rect, LPWSTR lpsName)
{
MessageBoxW(hWnd,lpsName,"",MB_OK);

UINT WidthW, HeigthW;
::GetClientRect(hWnd, &rect);
WidthW = .....;
.....;
.....;
..;
}

messagebox Показывает квадратики,
textout выводит ББББББББББББББ и т.д.
87
10 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
А если попробовать так:

MessageBoxW(hWnd, lpsname, "", MB_OK);

то есть обратиться к глобальной переменной (с маленькой n), а не к параметру функции LoadImageFile (с большой N). Тоже квадраты будут?
45K
10 декабря 2009 года
rookie
21 / / 15.10.2009
Цитата: Kogrom
А если попробовать так:

MessageBoxW(hWnd, lpsname, "", MB_OK);

то есть обратиться к глобальной переменной (с маленькой n), а не к параметру функции LoadImageFile (с большой N). Тоже квадраты будут?


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

87
10 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
rookie, ну как мы определим по кускам кода где у тебя ошибка? Ты даже объявление этой переменной lpsname нигде не выложил.

Тренировка в телепатии - это конечно хорошо, но тебе то от этого лучше не будет.
45K
10 декабря 2009 года
rookie
21 / / 15.10.2009
среда visual studio.net 2003
архив с программой
45K
11 декабря 2009 года
rookie
21 / / 15.10.2009
Проблема решилась, хотя не понимаю почему.
Вначале LPSTR to LPWSTR я конверитровал макросом из ATL библиотеки
 
Код:
USES_CONVERSION;
lpsname = T2W(ofn.lpstrFile);

Сделал по другому через MultiByteToWideChar
 
Код:
int length = MultiByteToWideChar(CP_ACP,0,ofn.lpstrFile,-1, NULL, 0);
wchar_t *buffer = new wchar_t[length];
MultiByteToWideChar(CP_ACP, 0, ofn.lpstrFile, -1, buffer, length);
lpsname = buffer;

Все работает.
Остался только вопрос, почему используя T2W происходит такая фигня?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог