|
|
|
| Неподскажете изза чего происходит такое в Visual C++ 6 пишеш по обычному
и все работает а вот в Visual C++ 8 я долго допирал как вывести обычное окно с сообщением а получилось только одним способом
MessageBoxA(0,'test','my project',MB_OK);
|
Не подскажите как вообще правильно вывводить окно и почему такая катовасия в разных версиях все по своему :( ? | |
|
|
|
|
|
|
|
для: sidPR
(02.01.2007 в 22:43)
| | При программировании под любую операционную систему, например, под Winodws, когда вы используется не чистый переносимый язык (С++), а интерфейс операционной системы (а оконный интерфейс по другому не построишь), следует помнить, что самое последнее слово за интерфесом операционной системы. В нашем случае - Windows API, всё остальное - это надстройка над API. Прототип функции о которой вы говориите, со времён Windows 98 выглядит следующим образом
int MessageBox(HWND hwndOwer,
LPCTSTR lpczText,
LPCTSTR lpszTitle,
UNIT uStyle) |
Всё остальное обёртки, которые скрывают сложность API Windows и облечают более эффективную работу программиста (правда, и выбивая почву у него из под ног, так как скрывают истинный интерфейс). Поэтому последний вариант самый верный - он будет рабтать всегда, а если не будет работать можно обратиться к MessageBox(), который обязан быть в любой системе, так как иначе половина программ под Windows работать перестанет. Первый вариант, с одним параметром - это просто вероятно перегруженный вариант функции. Используйте 4 параметра и ваша функция будет переносима от серды к среде программирования. | |
|
|
|
|
|
|
|
для: cheops
(02.01.2007 в 23:30)
| | Спасибо! | |
|
|
|
|
|
|
|
для: sidPR
(03.01.2007 в 00:09)
| | а что такое HWND hwndOwer ? и за что отвечает ... по дефолту я всегда ставлю 0 ...
почемуто когда я пишу так MessageBoxA(0,add_text,"заголовок",MB_OK);
|
Где в add_text тект передается он мне выдает ошибку
error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'CString' to 'LPCSTR' |
а когда тект в ковычках то все нормально =\ | |
|
|
|
|
|
|
|
для: sidPR
(03.01.2007 в 01:18)
| | >а что такое HWND hwndOwer ?
Дескриптор родительского окна... дело в том, что всё что вы видите - кнопки, тектовые области, формы, флажки, радио-кнопки и т.п. - это окна, только специально отрисованные и привязанные к другим окнам, когда вы указываете 0 (хотя следовало бы NULL, помоему) вместо дескриптора родительского окна, открываемое окно не привязывается к форме, а свободно болтается в окружающем пространстве - поэтому его можно перетаскивать куда угодно.
>Где в add_text тект передается он мне выдает ошибку
Осуществите операцию приведения типа, т.е. пишите что-то вроде
MessageBoxA(0,(LPCSTR)add_text.c_str(),"заголовок",MB_OK); |
| |
|
|
|
|
|
|
|
для: cheops
(03.01.2007 в 13:30)
| |
1>------ Rebuild All started: Project: test, Configuration: Release Win32 ------
1>Deleting intermediate and output files for project 'test', configuration 'Release|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>testDlg.cpp
1>.\testDlg.cpp(197) : error C2039: 'c_str' : is not a member
| of 'ATL::CStringT<BaseType,StringTraits>' | |
|
|
|
|
|
|
|
для: sidPR
(03.01.2007 в 17:38)
| | Хм... а если убрать c_str() что получается? Вообще c_str() - это метод стандартного класса string, тут вероятно он не реализован. | |
|
|
|
|
|
|
|
для: sidPR
(03.01.2007 в 01:18)
| | что такое add_text и как оно описано? | |
|
|
|
|
|
|
|
для: Trianon
(03.01.2007 в 23:11)
| | если так пишу
MessageBoxA(0,(LPCSTR)add_text,"заголовок",MB_OK);
|
выдает такую ошибку
1>.\testDlg.cpp(197) : error C2440: 'type cast' : cannot convert from 'CString' to 'LPCSTR'
|
насчет что такое Variable name: add_text, Элемента Edit control просто тект который я вбиваю в форму Edit control | |
|
|
|
|
|
|
|
для: sidPR
(04.01.2007 в 01:47)
| | Сделал так
MessageBoxA(NULL,(LPCSTR)(LPCTSTR)add_text,"заголовок",MB_OK);
|
при активации выпадает это окно но в add_text получается выводит только первый символ а не все :( | |
|
|
|
|
|
|
|
для: sidPR
(04.01.2007 в 02:15)
| | Никто не знает почему туды ток 1 символ влазиеть ? | |
|
|
|
|
|
|
|
для: sidPR
(05.01.2007 в 18:56)
| | У вас какая переменная с текстовой областью связана? add_text?
Заведите ещё одну переменную типа CString, пусть она называется temp, тогда её можно заполнить при помощи метода GetWindowText()
add_text.GetWindowText(temp); |
А вот temp подставляйте в MessageBoxA(). | |
|
|
|
|
|
|
|
для: cheops
(05.01.2007 в 20:06)
| | add_text какраз CString ... =\ если я напрямую вывож в окно ее оно нормально весь напечатанный текст отоброжает ну а если я в выпадающее окно вставляю то только 1 символ :( | |
|
|
|
|
|
|
|
для: sidPR
(09.01.2007 в 02:02)
| | А вы сообщение это где выводите? В MFC? | |
|
|
|
|
|
|
|
для: Евгений Петров
(09.01.2007 в 02:50)
| | Если так выводить че говорит?
CString add_text = "Hello!";
MessageBox(add_text); |
| |
|
|
|
|
|
|
|
для: Евгений Петров
(09.01.2007 в 02:55)
| | MessageBox(add_text); в 8 студии так не прокатит
а так у меня и есть
public:
CString add_text; | в Dlg.h
и другой метод ошибку выдал
>r:\!projects\test\test\testdlg.cpp(196) : error C2039: 'GetWindowTextW' : is not a member of 'ATL::CStringT<BaseType,StringTraits>'
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1>r:\!projects\test\test\testdlg.cpp(196) : error C2065: 'temp' : undeclared identifier
|
| |
|
|
|
|
|
|
|
для: sidPR
(09.01.2007 в 03:23)
| | Так попробуйте
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString); |
| |
|
|
|
|
|
|
|
для: sidPR
(09.01.2007 в 03:23)
| | Почему не прокатит? Под 8-й студией Вы что понимаете? VS .NET 2005? У меня она стоит, все нормально работает. | |
|
|
|
|
|
|
|
для: sidPR
(09.01.2007 в 03:23)
| | Это у вас что-то тоже с компилятором... у меня вообще не компелирует MFC приложения :( | |
|
|
|
|
|
|
|
для: DEM
(09.01.2007 в 19:55)
| | а что с ним может быть я ничего не настравал .. просто установил и все . и сделалй пару упражнений .. в 6 версии все пашет .. а вот в 8 я думаю не пашет изза того что компилятор более привередлив , и не прощяет мелких ошибок и недочетов я думаю в этом вся проблема ..
CString aadd_text = "Hello!";
MessageBox(aadd_text);
| так не работает!
выдает ошибку :
1>r:\!projects\test\test\testdlg.cpp(196) : error C2440: 'initializing' : cannot convert from 'const char [7]' to 'ATL::CStringT<BaseType,StringTraits>'
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> Constructor for class 'ATL::CStringT<BaseType,StringTraits>' is declared 'explicit'
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
|
Делаю так:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
| получаю вот что :
1>r:\!projects\test\test\testdlg.cpp(197) : warning C4996: 'wcscpy' was declared deprecated
1> r:\program files\microsoft visual studio 8\vc\include\string.h(250) : see declaration of 'wcscpy'
1> Message: 'This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
|
| |
|
|
|
|
|
|
|
для: sidPR
(10.01.2007 в 02:50)
| | Скиньте сюда весь прокет. (Только без Debug и *.ncb) | |
|
|
|
|
|
|
|
для: sidPR
(10.01.2007 в 02:50)
| | Или создайте новый небольшой проект... | |
|
|
|
|
|
|
|
для: cheops
(10.01.2007 в 14:08)
| |
// testDlg.cpp : implementation file
//
#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include <tchar.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CtestDlg dialog
CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CtestDlg::IDD, pParent)
, m_stat1(_T(""))
, add_text(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CtestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STATIC1, m_stat1);
DDX_Text(pDX, IDC_EDIT1, add_text);
}
BEGIN_MESSAGE_MAP(CtestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDCANCEL, &CtestDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CtestDlg::OnBnClickedButton2)
ON_STN_CLICKED(IDC_STATIC1, &CtestDlg::OnStnClickedStatic1)
ON_EN_CHANGE(IDC_EDIT1, &CtestDlg::OnEnChangeEdit1)
ON_EN_MAXTEXT(IDC_EDIT1, &CtestDlg::OnEnMaxtextEdit1)
END_MESSAGE_MAP()
// CtestDlg message handlers
BOOL CtestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CtestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CtestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CtestDlg::OnBnClickedCancel()
{
}
void CtestDlg::OnBnClickedButton1()
{
CAboutDlg aboutdlg;
aboutdlg.DoModal();
}
void CtestDlg::OnBnClickedButton2()
{
UpdateData(TRUE);
m_stat1=add_text;
UpdateData(FALSE);
}
void CtestDlg::OnStnClickedStatic1()
{
// TODO: Add your control notification handler code here
}
void CtestDlg::OnEnChangeEdit1()
{
UpdateData(TRUE);
m_stat1=add_text;
UpdateData(FALSE);
}
void CtestDlg::OnEnMaxtextEdit1()
{
UpdateData(TRUE);
MessageBoxA(NULL,(LPCSTR)(LPCTSTR)add_text,"заголовок",MB_OK);
}
|
| |
|
|
|
|
|
|
|
для: sidPR
(10.01.2007 в 14:40)
| | Нет, скиньте все файлы проекта. Там ещё куча заголовочных файлов. Ресурсы и все такое... | |
|
|
|
|
|
|
|
для: Евгений Петров
(10.01.2007 в 15:17)
| | В архиве вроде все файлы !
ftp://193.238.50.50/test.rar | |
|
|
|
|
|
|
|
для: sidPR
(10.01.2007 в 16:02)
| | Вы попытались получить доступ к адресу ftp://193.238.50.50/test.rar, который сейчас не доступен. Убедитесь, пожалуйста, что веб-адрес (URL) введен правильно и затем попытайтесь загрузить страницу еще раз. | |
|
|
|
|
|
|
|
для: Евгений Петров
(10.01.2007 в 19:39)
| | извиняюсь теперь все нормально должно быть | |
|
|
|
|
|
|
|
для: sidPR
(10.01.2007 в 23:22)
| | попробуйте:
| |
|
|
|
|
|
|
|
для: Евгений Петров
(11.01.2007 в 02:06)
| | Евгений Петров Великолепно! =) а что за "L" в двух словах?
и можно ли применить это в таком виде
MessageBoxA(NULL,L add_text,"заголовок",MB_OK); | |
|
|
|
|
|
|
|
для: sidPR
(11.01.2007 в 02:08)
| | По умолчанию, VS использует юникод. Когда вы пишете строку "Hello!" она по всей видимости в cp1251 записывается. L - перекодирует её. Можно ещё написать _T("Hello!")
L писать надо прямо перед строкой. Т.е.:
CString s = L"Hello!";
MessageBox(s); |
| |
|
|
|
|
|
|
|
для: Евгений Петров
(11.01.2007 в 02:14)
| | хм а как мне быть если я текст не сам пишу а он загоняется в переменную тоесть есть переменная add_text В ней текст а мне нужно его в окне вывести =\ | |
|
|
|
|
|
|
|
для: sidPR
(11.01.2007 в 02:17)
| | Ну вообще add_text у Вас типа CString, так что MessageBox(add_text); должно катить (и у меня катит) | |
|
|
|
|
|
|
|
для: Евгений Петров
(11.01.2007 в 02:14)
| | Да, кстати, юникод можно отключить в настройках: Alt + F7 -> Configuration Properties -> General -> Character Set: Not Set | |
|
|
|
|
|
|
|
для: Евгений Петров
(11.01.2007 в 02:18)
| | не мне нужно чтоб 4 аргумента было ....
MessageBox(NULL,add_text,"заголовок",MB_OK); отрубил юникод пишет ошибку мол
1>.\testDlg.cpp(196) : error C2660: 'CWnd::MessageBoxA' : function does not take 4 arguments |
| |
|
|
|
|
|
|
|
для: sidPR
(11.01.2007 в 02:21)
| | хотя я не совсем понимаю для чего нужен первый параметр ..
MessageBox(add_text, "Error", MB_OK);
|
так все окей ...
а вот так
MessageBox(NULL, add_text, "Error", MB_OK);
|
Ошибка :
(196) : error C2660: 'CWnd::MessageBoxA' : function does not take 4 arguments
|
Насчет первого аргумента хотелось бы узнать для чего он и зачем нужен? я так понил при обращении к окнам другими функциями типо ID ? и как мне извлечь параметр нажатой клавиши MB_YESNO тоесть как узнать что нажал пользователь куда передается и что? | |
|
|
|
|
автор: deZZineSS (21.01.2007 в 18:41) |
|
|
для: sidPR
(11.01.2007 в 02:39)
| | int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
|
Первый параметр - хэндл родительского окна.
Второй - длинный указатель на строку, в которой содержится текст окна
Тертий - -//- -//- ....................................................................... -//- -//- заголовок окна
Четвертый - стиль окна.
The return value is zero if there is not enough memory to create the message box.
If the function succeeds, the return value is one of the following menu-item values returned by the dialog box:
Value Meaning
IDABORT Abort button was selected.
IDCANCEL Cancel button was selected.
IDIGNORE Ignore button was selected.
IDNO No button was selected.
IDOK OK button was selected.
IDRETRY Retry button was selected.
IDYES Yes button was selected.
Т.е. функция возвращает 0, если окно создать не удалось. Если функция выполнилась успешно, то возвращает значение нажатой клавиши. Какой, см. выше. | |
|
|
|
|
|
|
|
для: deZZineSS
(21.01.2007 в 18:41)
| | Я, конечно, извиняюсь, но в MSDN MessageBox описана как BOOL | |
|
|
|
|
|
|
|
для: Фитч
(21.01.2007 в 19:28)
| | скажите так всё таки правильно написать в visual studio 2005
MessageBox("test");так было в 6 visual studio пожалуста скажите как правильно | |
|
|
|
|
|
|
|
для: puma
(02.02.2007 в 23:29)
| | Работает ли вариант, предложенный Евгением Петровым?
| |
|
|
|