Показать полную графическую версию : EditControl
Добрый день!
Столкнулся с проблемой визуализации (всегда писал консольные приложения).
Итак есть диалоговое окно IDD_DIALOG1, в нем есть editcontrol IDC_EDIT1, обявил объект CEdit *myEdit = new CEdit;, вопрос в следующем как мне связать myEdit и IDC_EDIT1, знаю что это просто)
Спасибо за рание.
IDC_EDIT1 - это скорее всего его Control ID. Скорее всего поможет:
edit1->AttachHandle(GetDlgItem(hdlg, IDC_EDIT1));
если имеется ввиду MFC
Да я пробовал так но у меня мало, что получилось, тогда я нашел в MSDN DoDataExchange(CDataExchange* pDX), проблема решилась сама собой..))
Но сейчас возникла другая(
При нажатии кнопки ну скажем Ок у меня начинает выполнятся функция которая выводит результат своего действия как раз в этот Edit Control, но результат выводится по завершению работы функции. Искал что можно сделать, нашел что нужно как то создать отдельный поток для этой функции, в MSDN нашел
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Кто нить работал с этим “зверем”, помогите если есть опыт работы с подобными вещами, а то времени жалко пока до самого дойдет.
Спасибо за ранние.
void __stdcall foo(void*)
{
...
}
DWORD id;
HANDLE hthr;
hthr = CreateThread(0, 0x1000, foo, 0, 0, &id);
Не советую с ним работать, т.к. он не инициалицирует библиотеки C и C++. Лучше #include <process.h> _beginthread
_beginthread(foo, 0x1000);
pva
_beginthread работает только с "отдельными" функциями, а у меня метод класса, если его определять как static, то это переписывать весь код и извращятся с передачей указателя на класс((, есть ли функции работающие с методами класса??
Проще простого:
class Thread
{
HANDLE hthread;
static __stdcall gmain(Thread* thr)
{
try
{
thr->main();
}
catch(...)
{
abort();
}
}
public:
Thread() : hthread() {}
~Thread() {CloseHandle(hthread);}
void start()
{
// раздельно от конструктора, чтобы дать построиться синхронно.
// уничтожать лучше тоже синхронно, т.е. сборщиком мусора.
// не желательно объявлять Thread автоматической переменной.
// я про параметр просто забыл в аргументах написать
hthread = (HANDLE)_beginthread((void(*)(void*))gmain, this, 0x1000);
}
protected:
virtual void main() = 0;
};
...
class MyThread : public Thread
{
void main()
{
...
}
}
MyThread* my_thread = new MyThread();
my_thread->start();
Но по-моему, лучше сделать static MyThread::start(Thread*), которая запускает поток и вписывает его в список сборщика мусора (В своём классе я так и сделал).
А ещё вот как придумал:
struct thr_start_struct
{
Object* obj;
void (Object*::mbr)();
};
void threaded_proc(thr_start_struct* st)
{
(st->obj->*st->mbr)();
}
void start_threaded(Object* obj1, void (Object*::mbr1)())
{
thr_start_struct st;
st.obj = obj1;
st.mbr = mbr1;
_beginthread((void(*)(void*))threaded_proc, &st, 0x10000);
}
...
class A : public Object
{
void priv_foo()
{
...
}
public:
void foo()
{
...
}
void parallel_it()
{
start_threaded(this, (void(Object::*)())priv_foo);
}
};
start_threaded(this, (void(Object::*)())foo);
Но такой подход не позволяет управлять потоком (А также синхронизироваться).
Спасибо огромное буду пробовать
Итак сделал следующее:
class CDlg : public CDialog
{
public:
.
.
.
void SetEditString(CString cStr);
friend DWORD WINAPI FGetInfo(HANDLE lpParam);
afx_msg void OnStart(void);
.
.
private:
HANDLE hThread;
DWORD dwThreadId;
DECLARE_MESSAGE_MAP();
};
.
.
.
void CDlg::OnStart()
{
hThread = CreateThread(NULL,NULL,FGetInfo,this,0,&dwThreadId);
}
.
.
.
DWORD WINAPI FGetInfo(HANDLE lpParam)
{
.
.
.
//пытаюсь обратиться к указателю и вызвоть метод класса
lpParam->SetEditString(asd);
.
.
.
}
на что мне компилятор ругается
error C2227: left of '->SetEditString' must point to class/struct/union
type is 'HANDLE'
В чем моя ошибка, как я понимаю hThread = CreateThread(NULL,NULL,FGetInfo,this,0,&dwThreadId); передает this и потом я могу через него обращятся к членам класса, или я заблуждаюсь??
Поправте меня плиз.
Победил это так:
DWORD WINAPI FGetInfo(LPVOID lpParam)
{
CDlg *myDlg = (CDlg*)lpParam;
...
...
myDlg->SendMessage(WM_MYMESSAGE,WPARAM("Сообщение"),0);
...
}
в обработчике сообщение прописал
#define WM_MYMESSAGE (WM_USER+100)
....
....
BEGIN_MESSAGE_MAP(CDlg, CDialog)
ON_MESSAGE(WM_MYMESSAGE, OnUpdate)
END_MESSAGE_MAP()
и
LRESULT CDlg::OnUpdate(WPARAM wParam,LPARAM lParam)
{
m_pEdit+=(LPCTSTR)wParam;
m_pEdit+="\r\n";
UpdateData(FALSE);
return 0;
}
Все заработало)
Спасибо всем.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.