не работают полосы прокрутки. доброго времени суток. очень нужно реализовать функцию открытия txt файлов и вывода содержимого файлов на экран в отдельном окне. вот что набросал уже: класс окна для вывода в него содержимого файла: Code: class COpenWnd:public CFrameWnd { public: COpenWnd(CWnd *wnd); }; COpenWnd::COpenWnd(CWnd *wndPerent) { CRect rectWnd(25,25,700,500); Create(NULL, "Opened file", WS_OVERLAPPEDWINDOW | WS_HSCROLL |WS_VSCROLL , rectWnd, wndPerent, NULL); } и функция, которая открывает файл и выводит его содержимое в окно: Code: void CMyFrameWin::OnOpen() { CString m_Text, path; CFileDialog dlgOpen(TRUE, "txt","", OFN_HIDEREADONLY, "BLOKNOT (*.txt)| *.txt| VISUAL C++ (*.cpp)| *.cpp| ALL Files(*.*)|*.*|", this); if(dlgOpen.DoModal()==IDOK) { CStdioFile File(dlgOpen.GetPathName(), CFile::modeRead| CFile::typeBinary); CString & ref=m_Text; path=dlgOpen.GetPathName(); COpenWnd *OpenWnd=new COpenWnd(this); OpenWnd -> ShowWindow(SW_SHOWNORMAL); OpenWnd -> UpdateWindow(); CClientDC dc(OpenWnd); int y=30; CFont l_font; l_font.CreatePointFont(150,"Lucida Console"); CFont* l_old_font = dc.SelectObject(&l_font); dc.TextOut(10,10,path); dc.SelectObject(l_old_font); while (File.ReadString(ref)!=NULL) { CFont l_font; l_font.CreatePointFont(150,"Lucida Console"); CFont* l_old_font = dc.SelectObject(&l_font); dc.SetTextColor(RGB(y*10,y+19,y+50)); dc.TextOut(30,y,m_Text, strlen(m_Text)-1); y=y+45; dc.SelectObject(l_old_font); } } } проблема: никак не получается сделать рабочие полосы прокрутки, чтоб когда в файле большой текст, то можно было с помощью полос прокручивать и видеть все содержимое файла. помогите пожалуйста новичку. большое спасибо!
А зачем ты текст через dc отрисовываешь? Ты же используешь стандартные компоненты, поэтому используй Editbox или его производные, какой средой пользуешься?
спасибо за совет. в общем принял во внимание и вот к чему дошел: http://www.gfs-team.ru/?act=articles&pact=122 только вот у меня это отдельное диалоговое окно в приложении, которое открывается по нажатии ОПЕН. 1) создал класс class COpenDialog : public CDialog Code: class COpenDialog : public CDialog { public: afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); COpenDialog(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG_OPEN}; CEdit m_EditOpen; CEdit m_bOpen; protected: virtual void DoDataExchange(CDataExchange* pDX); protected: virtual void OnOK(); virtual void OnCancel(); virtual BOOL OnInitDialog(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() public: afx_msg void OnStnClickedBitmap1(); }; COpenDialog::COpenDialog(CWnd* pParent) : CDialog(COpenDialog::IDD, pParent) { } void COpenDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_OPEN_PATH, m_EditOpen); DDX_Control(pDX, IDC_OPEN_TEXT, m_bOpen); } BEGIN_MESSAGE_MAP(COpenDialog, CDialog) ON_WM_PAINT() ON_WM_SETCURSOR() ON_STN_CLICKED(IDB_BITMAP1, &COpenDialog::OnStnClickedBitmap1) END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////// BOOL COpenDialog:: OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { [COLOR=DarkOrange]----bla bla bla[/COLOR] } ///////////////////////////////////////////////////////////////////////////// void COpenDialog::OnPaint() { [COLOR=DarkOrange]----bla bla bla[/COLOR] } void COpenDialog::OnOK() { CString m_EditText; // TODO: Add your control notification handler code here CString fname; //Переменная для хранения имени файла CFile file; //обьект класса CFile char ch[1024]; //Буффер для чтения данных из файла if(!OpenRead) //Если OpenRead=false то показываем диалог открытия файлов { CFileDialog fDialog(TRUE); fDialog.DoModal(); m_EditOpen.SetWindowText(fDialog.GetPathName()); m_bOpen.SetWindowText("Read"); OpenRead = true; } else { m_EditOpen.GetWindowText(fname); //Получаем имя файла if(!file.Open(fname, CFile::modeRead, NULL)) //Открываем его { AfxMessageBox("Cannot open file"); return; } file.Read(&ch, 1024); //Читаем 1024 байт [B][COLOR=Red]//m_EditText.SetWindowText(ch);[/COLOR][/B] file.Close(); //Закрываем файл m_bOpen.SetWindowText("Open");//Меняем текст кнопки OpenRead = false; } CDialog::OnOK(); } void COpenDialog::OnCancel() { CDialog::OnCancel(); } BOOL COpenDialog::OnInitDialog() { CDialog::OnInitDialog(); m_EditOpen.SetWindowText(CString("файл")); m_bOpen.SetWindowText(CString("содержимое")); UpdateData(false); OpenRead = false; return TRUE; } и подправил функцию ОПЕН с мейнфрейма, чтоб она вызывала диалог: Code: void CMyFrameWin::OnOpen() { COpenDialog dialog; if(dialog.DoModal()==IDOK); } при компиле имеем ошибку в строчке m_EditText.SetWindowText(ch); которую устранил пока лиш тем что закомментировал... суть ошибки : Code: [B][COLOR=Red]'SetWindowTextA' : is not a member of 'ATL::CStringT<BaseType,StringTraits>'[/COLOR][/B] в чем собственно трабла у как устранить данную проблему? среда разработки - Visual Studio 2008 Спасибо всем кто откликнется. --------------------EDIT--------------------- Спасибо за консультацию по аське groupby проблема была в: "m_EditText иметт тип CString а должен иметь тип CEdit" --------------------EDIT---------------------
Всем привет. Проблемка тут возникла. Имеется следующий код: Code: if(CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 4) == INVALID_HANDLE_VALUE) { ShowMessage(IntToStr(GetLastError())); } Получаю ошибку 8: Недостаточно памяти для обработки команды. Как решить эту проблему? С другими процессами все норм, а вот с этим нет
Есть элемент CWebBrowser2, как в него можно задать куки из программы. т.е есть страница куда без кукисов или логина и пароля не попадешь, куки я как раз знаю. Я так понимаю мне их надо просто прописать в ие, но как?
criz, больше чем уверен, что ты намутил что-то с обработкой ошибок. Скорее всего тебе возвращается отказ в доступе, а не ошибка по памяти. Попробуй скомпилять этот кусок кода: Code: #include <windows.h> #include <tlhelp32.h> int main (int argc, char* argv[]) { HANDLE hSnapshot; LPVOID lpMsgBuf; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 4); if (hSnapshot == INVALID_HANDLE_VALUE) { FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONERROR); LocalFree(lpMsgBuf); } return 0; }
groundhog, я тоже подумывал насчет нехватки прав... Вот код, который, как мне показалось, "дает" права: Code: void chPriv(int res) { HANDLE hToken; if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { TOKEN_PRIVILEGES priv; priv.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid); if(res) priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else priv.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, 0, &priv, sizeof(priv), NULL, NULL); CloseHandle(hToken); } } Есть ли здесь ошибка? Если не использовать эту функцию, то вылетает ошибка "не хватает прав", а если использовать - "не хватает памяти".
Ну на первый взгляд - всё верно. Покажи весь исходник, трудно говорить о проблеме на словах. Чтобы понять в чём проблема нужно оттрассировать исходник, так что выложи где-нить, если не хочешь публично светить...
Вот, весь код: Code: #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #define dwPID 4 void chPriv(int res); int main(int argc, char* argv[]) { MODULEENTRY32 mod; LPVOID lpMsgBuf; HANDLE snap = INVALID_HANDLE_VALUE; chPriv(1); snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); if(snap == INVALID_HANDLE_VALUE) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, NULL); MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONERROR); LocalFree(lpMsgBuf); return 1; } mod.dwSize = sizeof( MODULEENTRY32 ); if( !Module32First(snap, &mod) ) { printf("Module32First: %d\n", GetLastError()); CloseHandle(snap); return 1; } do { printf("%s\t", mod.szModule); printf("0x%X\n", mod.modBaseAddr); } while( Module32Next(snap, &mod)); chPriv(0); CloseHandle(snap); getchar(); return 0; } void chPriv(int res) { HANDLE hToken; if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { TOKEN_PRIVILEGES priv; priv.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid); if(res) priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else priv.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, 0, &priv, sizeof(priv), NULL, NULL); CloseHandle(hToken); } }
Ребята, помогите пожалуйста... голова уже забита.. есть функция, которая считывает данные с файла и передает их в эдитбокс. по дефолту там считывает 1024 байта. не больше и не меньше. как в MFC получить длину файла и считывать такое количество байт, которое нужно, а не строго только 1024.. вот код: Code: [B] void COpenDialog::OnOpen() { CString fname; //Переменная для хранения имени файла CFile file; //обьект класса CFile [COLOR=Red]char ch[1024]; //Буффер для чтения данных из файла[/COLOR] if(!OpenRead) //Если OpenRead=false то показываем диалог открытия файлов { CFileDialog fDialog(TRUE); fDialog.DoModal(); m_EditOpen.SetWindowText(fDialog.GetPathName()); m_bOpen.SetWindowText("Read"); OpenRead = true; } else { m_EditOpen.GetWindowText(fname); //Получаем имя файла if(!file.Open(fname, CFile::modeRead, NULL)) //Открываем его { AfxMessageBox("Cannot open file"); return; } [COLOR=Red]file.Read(&ch, 1024); //Читаем 1024 байт[/COLOR] m_EditText.SetWindowText(ch); file.Close(); //Закрываем файл m_bOpen.SetWindowText("Open");//Меняем текст кнопки OpenRead = false; } }[/B] никак не могу вкурить как сюда прилепить CFile::GetLength.. а завтра нужно сдать.. кто нить на свежую голову посмотрите что там можно сделать. спасибо, друзья.
под рукой нету компилятора, попробуй подставлять CFile вроде как-то так: file.Read(&ch, CFile); ногами не пинать, не уверен на 55 персентов. (имеется ввиду то, что ты не можеш подставить)
не так не катит... вот что я пробовал, получить сразу длину в самой функции считывания. file.Read(&ch, CFile::GetLength(fDialog.GetPathName())); но тоже не катит.. хз.. пробую дальше. кто что подскажет? спс.