Поиск:

Ответ в темуСоздание новой темы Создание опроса
> форма на MSVC++ 6.0, с чего начать? 
:(
    Опции темы
Albor
Дата 18.5.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(eugeniy @  17.5.2010,  21:07 Найти цитируемый пост)
 Image.Load(Foto(GetBuffer())) 

Код

Foto.GetBuffer();
....
 Foto.ReleaseBuffer();// иначе дальше не сможешь изменять переменную

PM MAIL ICQ   Вверх
eugeniy
Дата 18.5.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата(Albor @ 18.5.2010,  10:06)
Цитата(eugeniy @  17.5.2010,  21:07 Найти цитируемый пост)
 Image.Load(Foto(GetBuffer())) 

Код

Foto.GetBuffer();
....
 Foto.ReleaseBuffer();// иначе дальше не сможешь изменять переменную

Вообщем ситуация такая:
Когда делаю выборку данных из mysql:
Код
BOOL CReader::Card_read()
{
.........
while((row = mysql_fetch_row (res)))
                    {
                                
                                snprintf(kurs,50,"SELECT tech_name FROM kursnames WHERE kurs_id = %s", row[34]);
                                mysql_query(conn,kurs);                            
                                    
                                if (!(res=mysql_store_result(conn))){
                                            AfxMessageBox("ERROR(2): error_result\n");
                                            return FALSE;
                                }
                                        
                                kurs_name = mysql_fetch_row(res);

                                snprintf(fakultet,100,"SELECT tech_name FROM faculty WHERE faculty_id = %s", row[35]);
                                mysql_query(conn,fakultet);        
                                    
                                if (!(res=mysql_store_result(conn))){
                                            AfxMessageBox("ERROR(3): error_result\n");
                                            return FALSE;
                                }

                                fakultet_name = mysql_fetch_row(res);
    
                                birth=strtok(row[10], " ");
                            
                                
                                printf("%s %s %s %s %s %s\t",row[4],row[5],row[6],row[20],birth,kurs_name[0],fakultet_name[0]);
                                fprintf(file,"%s %s %s %s %s %s\t",row[4],row[5],row[6],birth,kurs_name[0],fakultet_name[0]);
                                    
                                Familiya = row[4];
                                Imya = row[5];
                                Ot4estvo = row[6];
                                Kurs = kurs_name[0];
                                Fakultet = fakultet_name[0];
                                Foto = row[20];
}

то в дебаггере вижу, что в foto попало нужно значение, например, 1234.jpg.

Потом же после выборки я попадаю сюда:
Код

void CReaderDlg::OnTimer(UINT nIDEvent)
{
    CDialog::OnTimer(nIDEvent);

    m_reader = new CReader;
    if(!(m_reader->Reader_Init()))
        EndDialog(0);
    
        if(!(m_reader->Read_serial_number()))
            EndDialog(0);

вот сюда->    if(m_reader->Card_read())
        {
            m_birthday_CTRL.SetWindowText(m_reader->birth);    
            m_surname_CTRL.SetWindowText(m_reader->Familiya);
            m_name_CTRL.SetWindowText(m_reader->Imya);
            m_patronymic_CTRL.SetWindowText(m_reader->Ot4estvo);
            m_kurs_CTRL.SetWindowText(m_reader->Kurs);
            m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);
            UpdateData(FALSE);
        }
        else
            EndDialog(0);


}

и сразу же как-только я вхожу в функцию void CReaderDlg::OnTimer(UINT nIDEvent) , то сразу переменная foto становится пустая
Код

foto = "";


сделал в функции BOOL CReaderDlg::OnEraseBkgnd(CDC* pDC) проверку на пустоту, чтобы не валился код.
Код

BOOL CReaderDlg::OnEraseBkgnd(CDC* pDC)
{    
    CRect rect;
    GetClientRect(&rect);
    CBrush brush;
    DWORD color = GetSysColor(COLOR_3DFACE);
    brush.CreateSolidBrush(color);
    pDC->FillRect(&rect,&brush);

    CImage image,image2;
    
    
        
    if (strcmp(Foto, "") == 0)
        return false;

    image.Load(LPCTSTR(Foto));
    int w = image.GetWidth();
        int h = image.GetHeight();     
    int tnh = 200;
    int tnw = 200 * w / h;
    int bpp = image.GetBPP();
    
    image2.Create(tnw,tnh,bpp);
    HDC h2=image2.GetDC();

    SetStretchBltMode(h2,HALFTONE);
    image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);
    image2.ReleaseDC();

    HBITMAP        hbmp = m_photo.GetBitmap();
    CBitmap       *bmp = CBitmap::FromHandle(hbmp);
    CDC            dc;
    dc.CreateCompatibleDC(NULL);
    CBitmap*    old = dc.SelectObject(bmp);
    m_photo.SetBitmap((HBITMAP)image2);

    dc.SelectObject(old);
    m_photo.Invalidate();    

    return TRUE;    
}


такое ощущение, что надо что-то поменять местами.
может,
Код

image.Load(LPCTSTR(Foto));


нужно в другое место запихать?

не пойму никак, в чём дело.
Да, для справки у меня переменная foto объявлена два раза, сначала в
Код

class CReaderDlg : public CDialog
{
// Construction
public:
    CReaderDlg(CWnd* pParent = NULL);
CString Foto;
}



потом в
Код

class CReader
{
    public:
    CReader(void);
    ~CReader(void);
CString Foto;
}

PM MAIL WWW   Вверх
Albor
Дата 19.5.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Если переменная с таким именем есть и в классе CReader и в классе CReaderDlg, то это совершенно разные переменные. CString на пустую строку проверяется так:
Код

if( Foto.IsEmpty())...;


Это сообщение отредактировал(а) Albor - 19.5.2010, 09:55
PM MAIL ICQ   Вверх
Albor
Дата 19.5.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(eugeniy @  18.5.2010,  23:41 Найти цитируемый пост)
Потом же после выборки я попадаю сюда:

В этом месте установи Foto из CReaderDlg
PM MAIL ICQ   Вверх
eugeniy
Дата 19.5.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата(Albor @ 19.5.2010,  10:09)
Цитата(eugeniy @  18.5.2010,  23:41 Найти цитируемый пост)
Потом же после выборки я попадаю сюда:

В этом месте установи Foto из CReaderDlg

Когда я объявляю в одном классе CReaderDlg переменную foto, то при компиляции он мне пишет:
c:\program files\microsoft visual studio\vc98\bin\reader(3)\reader\reader_writer.cpp(258) : error C2065: 'Foto' : undeclared identifier

подключил хэдер readerDlg.h, переменная объявлена как public, не понимаю почему reader_writer.cpp не может до неё достучаться!?

Да, кстати, когда я делал с другими переменными
Код

CString Imya;
CString Familiya;
CString Kurs;
CString Fakultet;
CString Ot4estvo;


я же их объявлял и в CReaderDlg и в CReader и всё работало отлично. А тут что-то капризничает. 
PM MAIL WWW   Вверх
Albor
Дата 20.5.2010, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(eugeniy @  19.5.2010,  22:16 Найти цитируемый пост)
я же их объявлял и в CReaderDlg и в CReader и всё работало отлично. А тут что-то капризничает.

вот фрагмент твоего кода:
Код

m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);

Здесь ты копируешь текст из CReader в контрол принадлежащий CReaderDlg. Почему у тебя возникает проблема копирования строки - не понимаю. Делай по шагам:
1. Объяви в CReaderDlg переменную CString m_ImageFileName;
2. В OnTimer, где читаешь карточку и перебрасываешь данные в CReaderDlg, присваиваешь этой переменной значение
Код

m_ImageFileName=m_reader->Foto;

Цитата(eugeniy @  19.5.2010,  22:16 Найти цитируемый пост)
Когда я объявляю в одном классе CReaderDlg переменную foto, то при компиляции он мне пишет:
c:\program files\microsoft visual studio\vc98\bin\reader(3)\reader\reader_writer.cpp(258) : error C2065: 'Foto' : undeclared identifier

Правильно, ты объявил переменную в одном классе, а пытаешься доступиться к ней из другого, а этот "другой" ни слухом ни духом не знает о первом. После того, как объявляешь с тем же именем переменную в "слепом" классе, компилятор перестаёт ругаться, но данные то остаются в CReader::Foto, а CReaderDlg::Foto, как была пустой при создании, так и осталась. Кстати, разницу в именах переменных заметил? smile
PM MAIL ICQ   Вверх
eugeniy
Дата 29.5.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата
 Делай по шагам:
1. Объяви в CReaderDlg переменную CString m_ImageFileName;
2. В OnTimer, где читаешь карточку и перебрасываешь данные в CReaderDlg, присваиваешь этой переменной значение
Код

m_ImageFileName=m_reader->Foto;


всё сделал так как вы сказали, получилось вот так:
Код

class CReaderDlg : public CDialog
{
// Construction
public:
CString m_foto;


Код
class CReader
{
    public:
    CString Foto;


Код
void CReaderDlg::OnTimer(UINT nIDEvent) 
{
    CDialog::OnTimer(nIDEvent);

    m_reader = new CReader;
    if(!(m_reader->Reader_Init()))
        EndDialog(0);
    
        if(!(m_reader->Read_serial_number()))
            EndDialog(0);

            
        if(m_reader->Card_read())
        {
            m_foto = m_reader->Foto;

после этого фото всё равно не выводит на главном диалоге, а когда нажимаю кнопку "заявление на мат.помощь" выводится второй диалог и после его закрытия, на главном диалоге прорисовывается фото и вылетает с ошибкой
следующего содержания:
Debug Assertion Failed!

Program:...
File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h
Line:503

Expression: m_hBitmap==0

вот так(

Код
BOOL CReaderDlg::OnEraseBkgnd(CDC* pDC) 
{    
    CRect rect;
    GetClientRect(&rect);
    CBrush brush;
    DWORD color = GetSysColor(COLOR_3DFACE);
    brush.CreateSolidBrush(color);
    pDC->FillRect(&rect,&brush);
            
    if (m_foto.IsEmpty())
        return false;

    image.Load(LPCTSTR(m_foto));


Цитата
 Кстати, разницу в именах переменных заметил? smile


если честно нет)
PM MAIL WWW   Вверх
Albor
Дата 30.5.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(eugeniy @  29.5.2010,  15:44 Найти цитируемый пост)
если честно нет) 

CReader::Foto и CReaderDlg::Foto - это полные имена переменных, состоящих из области видимости и имени переменной. Имена самих переменных одинаковые, а область видимости разная. Это всё равно, что записать файл с именем foto.bmp на диск С и на диск D, если изменить файл на диске С, то на D, он останется неизменённым и наоборот.
По рисованию: судя по ошибке - попытка нарисовать "пустую" картинку. Перед вызовом функции рисования картинки, проверяй m_hBitmap и рисуй, если он не равен нулю.
PM MAIL ICQ   Вверх
eugeniy
Дата 7.6.2010, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



Всё вроде работает. Отлично выводит картинку. 
вот кусок рабочего кода, отвечающий за вывод картинки.
Код

CImage image, image2;
image.Load(LPCTSTR(m_reader->Foto));
    
int w = image.GetWidth(); 
int h = image.GetHeight();    
int tnh = 200;
int tnw = 200 * w / h;
int bpp = image.GetBPP();

image2.Create(tnw,tnh,bpp);
HDC h2 = image2.GetDC();
SetStretchBltMode(h2, HALFTONE);
image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);    
image2.ReleaseDC();
m_photo.SetBitmap(image2);    


можно узнать как проверить существование файла? есть ли в mfc какие-нить средства?    

PM MAIL WWW   Вверх
Albor
Дата 7.6.2010, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(eugeniy @  7.6.2010,  01:38 Найти цитируемый пост)
можно узнать как проверить существование файла? есть ли в mfc какие-нить средства?   

Есть класс CFile. Его метод Open, возвращает логическое значение.

Добавлено через 3 минуты и 44 секунды
Или посмотри в сторону класса CFileFind
PM MAIL ICQ   Вверх
eugeniy
Дата 10.6.2010, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



А можете показать как правильно сделать проверку на существование файла?

Спасибо
PM MAIL WWW   Вверх
Albor
Дата 10.6.2010, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Можно так:
Код

#include <shlwapi.h>
//.......
if(PathFileExists(_T("1.txt"))) 
   MessageBox(_T("File Exist"));
else 
   MessageBox(_T("File NOT Exist"));

PM MAIL ICQ   Вверх
eugeniy
Дата 10.6.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.3.2010
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата(Albor @ 10.6.2010,  09:45)
Можно так:
Код

#include <shlwapi.h>
//.......
if(PathFileExists(_T("1.txt"))) 
   MessageBox(_T("File Exist"));
else 
   MessageBox(_T("File NOT Exist"));

спасибо
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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