Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » EditControl

Ответить
Настройки темы
EditControl
lehha


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 11:15, 20-12-2005

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


IDC_EDIT1 - это скорее всего его Control ID. Скорее всего поможет:
Код: Выделить весь код
edit1->AttachHandle(GetDlgItem(hdlg, IDC_EDIT1));
если имеется ввиду MFC

Отправлено: 14:57, 21-12-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

lehha


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 15:11, 21-12-2005 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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);

Отправлено: 08:57, 22-12-2005 | #4

lehha


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 09:33, 22-12-2005 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:37, 22-12-2005 | #6

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


А ещё вот как придумал:
Код: Выделить весь код
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);
Но такой подход не позволяет управлять потоком (А также синхронизироваться).

Отправлено: 11:45, 22-12-2005 | #7

lehha


Сообщения: n/a

Профиль | Цитировать


Спасибо огромное буду пробовать

Отправлено: 12:15, 22-12-2005 | #8

lehha


Сообщения: n/a

Профиль | Цитировать


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


Отправлено: 16:25, 22-12-2005 | #9

lehha


Сообщения: n/a

Профиль | Цитировать


Победил это так:
Код: Выделить весь код
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;
}
Все заработало)
Спасибо всем.

Отправлено: 13:29, 23-12-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » EditControl

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход