Войти

Показать полную графическую версию : EditControl


lehha
20-12-2005, 11:15
Добрый день!
Столкнулся с проблемой визуализации (всегда писал консольные приложения).
Итак есть диалоговое окно IDD_DIALOG1, в нем есть editcontrol IDC_EDIT1, обявил объект CEdit *myEdit = new CEdit;, вопрос в следующем как мне связать myEdit и IDC_EDIT1, знаю что это просто)
Спасибо за рание.

pva
21-12-2005, 14:57
IDC_EDIT1 - это скорее всего его Control ID. Скорее всего поможет:

edit1->AttachHandle(GetDlgItem(hdlg, IDC_EDIT1));

если имеется ввиду MFC

lehha
21-12-2005, 15:11
Да я пробовал так но у меня мало, что получилось, тогда я нашел в 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
);
Кто нить работал с этим “зверем”, помогите если есть опыт работы с подобными вещами, а то времени жалко пока до самого дойдет.
Спасибо за ранние.

pva
22-12-2005, 08:57
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);

lehha
22-12-2005, 09:33
pva
_beginthread работает только с "отдельными" функциями, а у меня метод класса, если его определять как static, то это переписывать весь код и извращятся с передачей указателя на класс((, есть ли функции работающие с методами класса??

pva
22-12-2005, 11:37
Проще простого:

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*), которая запускает поток и вписывает его в список сборщика мусора (В своём классе я так и сделал).

pva
22-12-2005, 11:45
А ещё вот как придумал:

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);

Но такой подход не позволяет управлять потоком (А также синхронизироваться).

lehha
22-12-2005, 12:15
Спасибо огромное буду пробовать

lehha
22-12-2005, 16:25
Итак сделал следующее:

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 и потом я могу через него обращятся к членам класса, или я заблуждаюсь??
Поправте меня плиз.

lehha
23-12-2005, 13:29
Победил это так:

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