Skill

MFC এর উইন্ডো ম্যানেজমেন্ট (Window Management)

এমএফসি (MFC) - Microsoft Technologies

362

MFC (Microsoft Foundation Classes) অ্যাপ্লিকেশনে Window Management হল এমন একটি প্রক্রিয়া যা অ্যাপ্লিকেশন উইন্ডোগুলোর সৃজন, নিয়ন্ত্রণ, এবং ব্যবস্থাপনা সম্পাদন করে। MFC তে উইন্ডো ম্যানেজমেন্টের মাধ্যমে আপনি বিভিন্ন ধরনের উইন্ডো তৈরি করতে পারেন, যেমন মূল উইন্ডো, ডায়ালগ উইন্ডো, সাব উইন্ডো, বা পপ-আপ উইন্ডো। উইন্ডো ম্যানেজমেন্টের জন্য MFC কিছু মৌলিক ক্লাস এবং ফাংশন প্রদান করে, যা উইন্ডোর জীবনচক্র এবং অন্যান্য সম্পর্কিত কার্যক্রম পরিচালনা করতে সহায়তা করে। নিচে MFC এর উইন্ডো ম্যানেজমেন্টের বিভিন্ন দিক আলোচনা করা হলো।


উইন্ডো তৈরি (Creating a Window)

MFC তে উইন্ডো তৈরি করা মূলত CWnd অথবা এর সাবক্লাসগুলো ব্যবহার করে করা হয়। সাধারণত, CFrameWnd এবং CDialog ক্লাস উইন্ডো তৈরি করতে ব্যবহৃত হয়।

  • CFrameWnd হল প্রধান উইন্ডো তৈরি করার জন্য ব্যবহৃত ক্লাস, এবং এটি MDI (Multiple Document Interface) বা SDI (Single Document Interface) অ্যাপ্লিকেশনগুলির মূল উইন্ডো হিসেবে কাজ করে।
  • CDialog হল ডায়ালগ বক্স তৈরি করতে ব্যবহৃত ক্লাস, যা সাধারণত ইনপুট বা কনফিগারেশন সংক্রান্ত উইন্ডো হিসেবে ব্যবহৃত হয়।

Code Example:

// Main window তৈরি
CFrameWnd* pFrame = new CFrameWnd;
pFrame->Create(NULL, _T("MFC Application"));
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();

এটি একটি সাধারণ Main Window তৈরি করবে এবং সেটি প্রদর্শন করবে।


উইন্ডো ক্লাস রেজিস্ট্রেশন (Window Class Registration)

উইন্ডো তৈরির আগে, একটি উইন্ডো ক্লাস রেজিস্টার করতে হয়। এটি AfxRegisterClass বা RegisterClass ফাংশনের মাধ্যমে করা হয়। উইন্ডো ক্লাস রেজিস্ট্রেশন উইন্ডোর বিভিন্ন বৈশিষ্ট্য এবং আচরণ নির্ধারণ করে।

Code Example:

WNDCLASS wc;
wc.lpfnWndProc = AfxWndProc;  // উইন্ডো প্রসেসিং ফাংশন
wc.lpszClassName = _T("MyWndClass");
wc.hInstance = AfxGetInstanceHandle();
RegisterClass(&wc);

এটি MyWndClass নামে একটি উইন্ডো ক্লাস রেজিস্টার করবে, যার জন্য উইন্ডো প্রসেসিং ফাংশন এবং অন্যান্য প্রপার্টি নির্ধারণ করা হবে।


উইন্ডো কাস্টমাইজেশন (Customizing Windows)

MFC উইন্ডো কাস্টমাইজেশনের জন্য উইন্ডো ক্লাসের বিভিন্ন বৈশিষ্ট্য পরিবর্তন করতে পারে। যেমন উইন্ডো আকার, অবস্থান, শিরোনাম, অথবা উইন্ডোর অন্যান্য সজ্জা।

  • উইন্ডো শিরোনাম পরিবর্তন:
SetWindowText(_T("New Window Title"));

এটি উইন্ডোর শিরোনাম পরিবর্তন করে "New Window Title" সেট করবে।

  • উইন্ডো আকার পরিবর্তন:
MoveWindow(0, 0, 800, 600); // উইন্ডোকে নতুন আকারে স্থানান্তরিত করা

এটি উইন্ডোকে নতুন আকারে সেট করবে, যেখানে আর্গুমেন্টগুলি যথাক্রমে এক্স, ওয়াই, প্রস্থ, এবং উচ্চতা।


উইন্ডো প্রক্রিয়াকরণ (Window Processing)

MFC তে উইন্ডো মেসেজগুলি বিভিন্ন অ্যাকশনের জন্য রেসপন্ড করার জন্য ব্যবহৃত হয়, যেমন ক্লিক, কী প্রেস, বা অন্য কোন ইন্টারঅ্যাকশন। উইন্ডো মেসেজগুলির মাধ্যমে অ্যাপ্লিকেশন বিভিন্ন ইভেন্ট পরিচালনা করে।

  • ওভাররাইডিং উইন্ডো প্রসেসিং:
LRESULT CMyWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == WM_LBUTTONDOWN) 
    {
        // মাউস ক্লিক প্রক্রিয়া
    }
    return CWnd::WindowProc(message, wParam, lParam);
}

এটি উইন্ডোতে মাউস ক্লিকের জন্য মেসেজ হ্যান্ডলিং করে। যখন মাউস বাটন ক্লিক করা হয়, তখন WM_LBUTTONDOWN মেসেজটি অ্যাপ্লিকেশন গ্রহণ করবে এবং এর জন্য নির্ধারিত ফাংশন কার্যকর হবে।


উইন্ডো লাইফ সাইকেল (Window Lifecycle)

একটি MFC উইন্ডোর সাধারণ জীবনচক্রে বেশ কিছু গুরুত্বপূর্ণ ধাপ থাকে, যেগুলি সঠিকভাবে পরিচালিত হলে উইন্ডোটি সফলভাবে কাজ করবে।

  1. CreateWindow: উইন্ডো তৈরি করা
  2. ShowWindow: উইন্ডো প্রদর্শন করা
  3. UpdateWindow: উইন্ডো কনটেন্ট আপডেট করা
  4. DestroyWindow: উইন্ডো ধ্বংস করা

MFC এ, OnCreate(), OnDestroy(), OnSize() ইত্যাদি মেম্বার ফাংশনগুলো উইন্ডো লাইফ সাইকেল পরিচালনা করতে ব্যবহৃত হয়।

Code Example:

int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    // উইন্ডো তৈরির পর অতিরিক্ত কাজ
    return 0;
}

void CMyWnd::OnDestroy()
{
    // উইন্ডো ধ্বংস হওয়ার আগে কাজ
    CWnd::OnDestroy();
}

উইন্ডো সাইজ এবং পজিশন (Window Size and Position)

MFC তে উইন্ডোর সাইজ এবং অবস্থান সহজেই পরিবর্তন করা যায়। MoveWindow(), SetWindowPos(), এবং GetClientRect() এর মতো ফাংশনগুলো উইন্ডোর অবস্থান এবং সাইজ কন্ট্রোল করতে ব্যবহৃত হয়।

  • উইন্ডোর সাইজ পাওয়া:
CRect rect;
GetClientRect(&rect); // ক্লায়েন্ট এরিয়ার সাইজ

এটি উইন্ডোর ক্লায়েন্ট এরিয়ার সাইজ ফেরত দেবে।

  • উইন্ডোর পজিশন পরিবর্তন:
SetWindowPos(&wndTop, 100, 100, 800, 600, SWP_SHOWWINDOW);

এটি উইন্ডোটিকে নতুন অবস্থানে এবং সাইজে সেট করবে।


সারাংশ

MFC তে Window Management উইন্ডো তৈরি, কাস্টমাইজেশন, এবং প্রক্রিয়াকরণ সম্পর্কিত একটি গুরুত্বপূর্ণ বিষয়। MFC উইন্ডো ম্যানেজমেন্টের মাধ্যমে আপনি সহজেই নতুন উইন্ডো তৈরি করতে পারেন, উইন্ডোদের মধ্যে ইন্টারঅ্যাকশন এবং মেসেজ হ্যান্ডলিং করতে পারেন। এছাড়াও, উইন্ডোর সাইজ এবং অবস্থান কাস্টমাইজ করতে, এবং উইন্ডো লাইফ সাইকেল ঠিকভাবে পরিচালনা করতে পারবেন। MFC উইন্ডো ম্যানেজমেন্টের সুবিধা হল এর সাদৃশ্যপূর্ণ ও কার্যকরী ইন্টারফেস যা উইন্ডো প্রোগ্রামিংকে সহজ এবং দ্রুত করে তোলে।

Content added By

MFC (Microsoft Foundation Classes) অ্যাপ্লিকেশনে, MDI (Multiple Document Interface) এবং SDI (Single Document Interface) হল দুটি প্রধান উইন্ডো ম্যানেজমেন্ট কৌশল, যেগুলি বিভিন্ন ধরণের অ্যাপ্লিকেশন ব্যবহারের জন্য উপযুক্ত। MDI এবং SDI এর মধ্যে মূল পার্থক্য হল, MDI একাধিক ডকুমেন্ট বা উইন্ডো পরিচালনা করতে পারে, যেখানে SDI একটি একক ডকুমেন্ট বা উইন্ডো নিয়ে কাজ করে।

এই দুটি মডেলের উইন্ডো ম্যানেজমেন্ট কৌশল সম্বন্ধে বিস্তারিত আলোচনা করা হলো।


SDI (Single Document Interface)

SDI মডেল একটি অ্যাপ্লিকেশন যেখানে ব্যবহারকারী একসঙ্গে একাধিক উইন্ডো খুলতে পারে না। এটি সাধারণত একক ডকুমেন্ট অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেমন টেক্সট এডিটর বা পেইন্ট প্রোগ্রাম। SDI অ্যাপ্লিকেশনগুলিতে, একটি সিঙ্গেল উইন্ডো থাকে, এবং ব্যবহারকারী সেই উইন্ডোর মধ্যে সমস্ত কার্যকলাপ করে। এটি সাধারণত একটি ফাইল বা ডকুমেন্ট পরিচালনা করে।

SDI Window Management কৌশলগুলি সাধারণত নিম্নলিখিত বৈশিষ্ট্যগুলি ধারণ করে:

  • একটি উইন্ডো থাকে, যা ব্যবহারকারীর কাজের জায়গা।
  • ব্যবহারকারী একসাথে একটাই ডকুমেন্ট বা ফাইল খুলতে পারেন।
  • উইন্ডো সাধারণত পূর্ণ স্ক্রীনে বা একটি নির্দিষ্ট আকারে থাকে।
  • মেনু এবং টুলবারের মাধ্যমে ব্যবহারকারীর কার্যক্রম পরিচালিত হয়।

Code Example:

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_FILE_NEW, &CMyView::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, &CMyView::OnFileOpen)
    ON_COMMAND(ID_FILE_SAVE, &CMyView::OnFileSave)
END_MESSAGE_MAP()

void CMyView::OnFileNew()
{
    AfxMessageBox(_T("New File Created"));
}

void CMyView::OnFileOpen()
{
    AfxMessageBox(_T("File Opened"));
}

void CMyView::OnFileSave()
{
    AfxMessageBox(_T("File Saved"));
}

এখানে CView ক্লাসের মাধ্যমে SDI অ্যাপ্লিকেশন তৈরি করা হয়েছে, যেখানে একক উইন্ডোতে কাজ করা হয়।


MDI (Multiple Document Interface)

MDI মডেল এমন অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত যেখানে ব্যবহারকারী একাধিক ডকুমেন্ট বা উইন্ডো খোলার সুযোগ পায়। যেমন, Microsoft Word, Adobe Photoshop, ইত্যাদি। MDI অ্যাপ্লিকেশনগুলি সাধারণত একটি প্রধান উইন্ডো ধারণ করে, যা সকল সেকেন্ডারি বা সাব-উইন্ডোগুলিকে নিয়ন্ত্রণ করে। MDI অ্যাপ্লিকেশনগুলোতে Child Windows থাকে, যেখানে প্রতিটি উইন্ডো একটি পৃথক ডকুমেন্ট বা ফাইল প্রদর্শন করে।

MDI Window Management কৌশলগুলির বৈশিষ্ট্য:

  • প্রধান উইন্ডো (Parent Window) থাকে, এবং তার মধ্যে একাধিক Child Windows খুলতে পারেন।
  • ব্যবহারকারী বিভিন্ন ডকুমেন্টের মধ্যে দ্রুত স্থানান্তর করতে পারে।
  • Child উইন্ডোগুলি সাধারণত Cascade বা Tile করা যায়।
  • প্রতিটি Child উইন্ডো নিজস্ব মেনু এবং টুলবার থাকতে পারে।

Code Example:

BEGIN_MESSAGE_MAP(CMDIFrameWnd, CFrameWnd)
    ON_COMMAND(ID_FILE_NEW, &CMDIFrameWnd::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, &CMDIFrameWnd::OnFileOpen)
END_MESSAGE_MAP()

void CMDIFrameWnd::OnFileNew()
{
    // Creating a new MDI child window
    CMyChildWnd* pChildWnd = new CMyChildWnd();
    pChildWnd->Create(NULL, _T("New MDI Child"));
    pChildWnd->ShowWindow(SW_SHOW);
}

void CMDIFrameWnd::OnFileOpen()
{
    // Open an existing MDI child window
    AfxMessageBox(_T("Open MDI Child File"));
}

এখানে, CMDIFrameWnd ক্লাস ব্যবহার করে MDI অ্যাপ্লিকেশন তৈরি করা হয়েছে, যা একাধিক Child Windows খুলতে পারে।


MDI এবং SDI এর মধ্যে পার্থক্য

বৈশিষ্ট্যSDIMDI
ডকুমেন্ট সংখ্যাএকক (Single)একাধিক (Multiple)
উইন্ডো সংখ্যাএকটি উইন্ডো থাকেএকাধিক উইন্ডো থাকে
এপ্লিকেশন উদাহরণটেক্সট এডিটর, পেইন্ট, ওয়েব ব্রাউজারMicrosoft Word, Adobe Photoshop, Excel
ডকুমেন্ট পরিবর্তনএকবারে একটিই ডকুমেন্ট দেখানো হয়একাধিক ডকুমেন্ট একসাথে দেখতে পারবেন
উইন্ডো ম্যানেজমেন্টশুধুমাত্র একটি উইন্ডো থাকে, কোন উইন্ডো স্যুইচিং নেইউইন্ডো স্যুইচিং, Cascade, Tile, এবং Minimize
প্যারেন্ট উইন্ডোথাকে নাপ্রধান প্যারেন্ট উইন্ডো থাকে

MDI উইন্ডো ম্যানেজমেন্ট কৌশল

MDI উইন্ডো ম্যানেজমেন্টের জন্য নিম্নলিখিত কৌশলগুলি ব্যবহার করা হয়:

  • Cascade: সকল Child উইন্ডো একে অপরের ওপর অবস্থান করবে।
  • Tile: উইন্ডোগুলিকে স্ক্রীনে সাজানোর জন্য টাইল লেআউট ব্যবহার করা হয়।
  • Minimize: Child উইন্ডোকে মিনিমাইজ করা যায়।

MDI অ্যাপ্লিকেশনগুলির জন্য, ব্যবহারকারী একাধিক ডকুমেন্ট খুলতে, স্থানান্তর করতে এবং উইন্ডোগুলি সাজাতে পারবে। MFC তে MDI উইন্ডো ম্যানেজমেন্টের জন্য CMainFrame এবং CMDIChildWnd ক্লাস ব্যবহার করা হয়।


সারাংশ

SDI এবং MDI হল MFC অ্যাপ্লিকেশনের দুটি গুরুত্বপূর্ণ উইন্ডো ম্যানেজমেন্ট কৌশল। SDI একক ডকুমেন্ট বা উইন্ডো নিয়ে কাজ করে, যেখানে MDI একাধিক ডকুমেন্ট বা উইন্ডো পরিচালনা করতে সক্ষম। MDI অ্যাপ্লিকেশন ব্যবহারকারীকে একাধিক উইন্ডোতে কাজ করার সুবিধা দেয়, যেখানে SDI অ্যাপ্লিকেশন একটি নির্দিষ্ট উইন্ডোতে সীমাবদ্ধ থাকে। MDI অ্যাপ্লিকেশনগুলিতে Child Windows এবং উইন্ডো ম্যানেজমেন্টের জন্য Cascade, Tile, এবং Minimize কৌশলগুলি ব্যবহার করা হয়।

Content added By

MFC (Microsoft Foundation Classes) এর মাধ্যমে window creation (উইন্ডো তৈরি), positioning (পজিশনিং), এবং resizing (আকার পরিবর্তন) অত্যন্ত গুরুত্বপূর্ণ ফিচার। উইন্ডো তৈরি করার সময় এর বিভিন্ন বৈশিষ্ট্য নির্ধারণ করা যায়, যেমন এর আকার, অবস্থান, এবং ব্যবহারকারীর ইন্টারঅ্যাকশন অনুযায়ী এর আকার পরিবর্তন। এই বিষয়গুলোর মাধ্যমে একটি ব্যবহারকারী বান্ধব, ইন্টারঅ্যাকটিভ এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করা যায়।


উইন্ডো তৈরি (Window Creation)

MFC অ্যাপ্লিকেশন তৈরির সময়, CWnd বা এর ভিত্তিতে তৈরি ক্লাস ব্যবহার করে উইন্ডো তৈরি করা হয়। উইন্ডো তৈরি করতে প্রধানত Create বা CreateEx মেথড ব্যবহার করা হয়, যেখানে উইন্ডোর বিভিন্ন বৈশিষ্ট্য (যেমন সাইজ, অবস্থান, স্টাইল ইত্যাদি) নির্ধারণ করা যায়।

Code Example:

BOOL CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (!CFrameWnd::OnCreate(lpCreateStruct))
        return -1;

    // উইন্ডো তৈরি এবং বৈশিষ্ট্য নির্ধারণ
    if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;
    }

    return 0;
}

এখানে CFrameWnd::OnCreate ফাংশনটি উইন্ডো তৈরি করার জন্য ব্যবহৃত হয় এবং এর ভিতরে বিভিন্ন কন্ট্রোল যেমন ToolBar বা অন্যান্য উইজেট যুক্ত করা যায়।


উইন্ডো পজিশনিং (Window Positioning)

MFC তে উইন্ডোর অবস্থান নির্ধারণ করার জন্য SetWindowPos() ফাংশন ব্যবহৃত হয়, যা একটি উইন্ডোকে নির্দিষ্ট স্থান বা কোটায় সরিয়ে নিয়ে যায়। SetWindowPos() বিভিন্ন প্যারামিটার গ্রহণ করে, যেমন উইন্ডোর অবস্থান, আকার, উইন্ডোর অর্ডার (ফরওয়ার্ড বা ব্যাকওয়ার্ড), এবং অন্যান্য গুণাবলি।

Code Example:

BOOL CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (!CFrameWnd::OnCreate(lpCreateStruct))
        return -1;

    // উইন্ডো পজিশনিং
    SetWindowPos(&wndTop, 100, 100, 800, 600, SWP_NOZORDER);

    return 0;
}

এখানে, SetWindowPos উইন্ডোকে (100, 100) কোটায় এবং সাইজ 800x600 এ সেট করবে। SWP_NOZORDER প্যারামিটার উইন্ডোর অর্ডার পরিবর্তন না করার জন্য ব্যবহৃত হয়।

SetWindowPos এর অন্যান্য প্যারামিটারগুলো হলো:

  • hwndInsertAfter: উইন্ডোটি কোথায় স্থান পাবে (উদাহরণস্বরূপ, &wndTop, &wndBottom, &wndTopMost ইত্যাদি)।
  • x, y: নতুন অবস্থান (পজিশন) নির্ধারণ।
  • cx, cy: উইন্ডোর নতুন সাইজ।
  • uFlags: পরিবর্তনটি কীভাবে কার্যকর হবে (যেমন SWP_NOZORDER, SWP_NOMOVE ইত্যাদি)।

উইন্ডো রিসাইজিং (Window Resizing)

MFC তে উইন্ডোর আকার পরিবর্তন করার জন্য OnSize() মেসেজ হ্যান্ডলার ব্যবহার করা হয়। এই ফাংশনটি তখন কল হয় যখন ব্যবহারকারী উইন্ডোর আকার পরিবর্তন করেন, অথবা প্রোগ্রাম্যাটিকভাবে আকার পরিবর্তন করা হয়।

Code Example:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    CFrameWnd::OnSize(nType, cx, cy);
    
    // উইন্ডোর সাইজ পরিবর্তন হলে টুলবার বা অন্যান্য কন্ট্রোলের সাইজ অটো-রিসাইজ
    if (m_wndToolBar.GetSafeHwnd())
    {
        m_wndToolBar.MoveWindow(0, 0, cx, 30);  // টুলবারের আকার পরিবর্তন
    }
}

এখানে, OnSize() ফাংশনটি উইন্ডোর সাইজ পরিবর্তন হলে কল হয়। এই ফাংশনের মাধ্যমে উইন্ডো বা অন্যান্য কন্ট্রোল (যেমন টুলবার) আকার পরিবর্তন করা যায়। nType প্যারামিটার উইন্ডোর সাইজ পরিবর্তনের ধরন নির্দেশ করে, যেমন:

  • SIZE_MINIMIZED: উইন্ডো মিনিমাইজ করা হয়েছে।
  • SIZE_MAXIMIZED: উইন্ডো ম্যাক্সিমাইজ করা হয়েছে।
  • SIZE_RESTORED: উইন্ডো রিসাইজ করা হয়েছে।

ডায়ালগ সাইজ পরিবর্তন (Dialog Resizing)

MFC অ্যাপ্লিকেশনে ডায়ালগ উইন্ডোর আকার পরিবর্তন করতে হলে, OnSize() ফাংশনের মাধ্যমে SetWindowPos() বা MoveWindow() ব্যবহার করা যায়, তবে ডায়ালগে কন্ট্রোলগুলোর সাইজ অটোমেটিকভাবে অ্যাডজাস্ট করা হয় না। ডায়ালগ উইন্ডোর কন্ট্রোলের সাইজ পরিবর্তন করার জন্য Resize মেকানিজম ব্যবহার করতে হয়।

Code Example:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    CFrameWnd::OnSize(nType, cx, cy);

    // কন্ট্রোলসের সাইজ পরিবর্তন
    if (m_wndToolBar.GetSafeHwnd())
    {
        m_wndToolBar.MoveWindow(0, 0, cx, 30);
    }
}

এটি নিশ্চিত করবে যে কন্ট্রোলস যেমন টুলবার বা অন্যান্য উইন্ডো সাইজ পরিবর্তন হলে সেগুলি সঠিকভাবে রিসাইজ হবে।


সারাংশ

Window Creation, Positioning, এবং Resizing MFC অ্যাপ্লিকেশনের গুরুত্বপূর্ণ উপাদান, যার মাধ্যমে অ্যাপ্লিকেশনের উইন্ডো তৈরি, পজিশন এবং আকার নিয়ন্ত্রণ করা যায়। Create বা CreateEx ফাংশনের মাধ্যমে উইন্ডো তৈরি করা হয় এবং SetWindowPos বা OnSize এর মাধ্যমে উইন্ডোর অবস্থান এবং আকার পরিবর্তন করা হয়। এই ফিচারগুলির মাধ্যমে ইউজার ইন্টারফেসে আরও নমনীয়তা এবং ব্যবহারকারী বান্ধব বৈশিষ্ট্য সংযুক্ত করা সম্ভব হয়।

Content added By

MFC (Microsoft Foundation Classes) তে Child Window এবং Parent Window দুটি গুরুত্বপূর্ণ ধারণা, যা উইন্ডো-ভিত্তিক অ্যাপ্লিকেশনের মধ্যে সম্পর্ক স্থাপন করে। এরা সাধারণত হায়ারার্কিক্যাল আর্কিটেকচার অনুযায়ী কাজ করে, যেখানে একটি Parent Window অনেকগুলি Child Window ধারণ করতে পারে।


Parent Window কী?

Parent Window হলো একটি উইন্ডো যা অন্য উইন্ডোগুলিকে ধারণ করে এবং নিয়ন্ত্রণ করে। এটি সাধারণত Main Window বা Frame Window হিসাবে কাজ করে, যা মূল অ্যাপ্লিকেশন উইন্ডোর কার্যকারিতা এবং রেন্ডারিং পরিচালনা করে। Parent Window তে অন্য ছোট উইন্ডোগুলি Child Windows হিসেবে যুক্ত হতে পারে, যেমন ডায়ালগ, পপ-আপ উইন্ডো, অথবা অন্যান্য কন্ট্রোলস।

Parent Window সাধারণত উইন্ডোর নিজস্ব ডিভাইস কন্টেক্সট, ইনপুট এবং উইন্ডো মেসেজগুলি পরিচালনা করে।

Code Example:

CMainFrame *pMainFrame = (CMainFrame*) AfxGetMainWnd();  // Parent window হল Main Frame

এখানে, CMainFrame হল Parent Window, যা অ্যাপ্লিকেশনের মূল উইন্ডো হিসেবে কাজ করছে।


Child Window কী?

Child Window হলো একটি উইন্ডো যা একটি Parent Window এর অধীনে কাজ করে এবং নির্দিষ্ট একটি অংশে রেন্ডার বা কাজ করে। Child Window সাধারণত একটি প্যানেল, ডায়ালগ বক্স, কন্ট্রোলস, অথবা মেনু হিসেবে কাজ করতে পারে, যা Parent Window এর একাংশ হিসেবে থাকে।

Child Windows অন্য উইন্ডো (Parent Window) এর সীমানার মধ্যে অবস্থান করে, এবং এগুলোর কন্ট্রোল সাধারণত Parent Window দ্বারা পরিচালিত হয়।

Code Example:

CDialogEx myChildDlg;
myChildDlg.Create(IDD_CHILD_DIALOG, pMainFrame);  // Child window

এখানে, myChildDlg হল একটি Child Window, যা IDD_CHILD_DIALOG ডায়ালগ টেমপ্লেটের মাধ্যমে Parent Window তে তৈরি হয়েছে।


Parent এবং Child Window এর মধ্যে সম্পর্ক

Parent Window এবং Child Window এর মধ্যে সম্পর্ক Hierarchy-based (হায়ারার্কিক্যাল) হয়। Parent Window এক বা একাধিক Child Window ধারণ করতে পারে এবং তাদের মধ্যে কমিউনিকেশন এবং কন্ট্রোল শেয়ার করা হয়।

1. Child Window কে Parent Window তে যুক্ত করা

MFC তে Child Window কে Parent Window এর মধ্যে যুক্ত করার জন্য Create অথবা CreateEx ফাংশন ব্যবহার করা হয়। Parent Window, Child Window এর অবস্থান, আকার এবং অন্যান্য বৈশিষ্ট্য সেট করতে পারে।

Code Example:

CChildWnd* pChildWnd = new CChildWnd;
pChildWnd->Create( IDD_CHILD_WINDOW, pParentWnd );

এখানে, CChildWnd হল Child Window ক্লাস, যা Parent Window (pParentWnd) এর অধীনে তৈরি করা হয়েছে।

2. Child Window এর ইভেন্ট Parent Window দ্বারা হ্যান্ডলিং

Child Window তে যেকোনো ব্যবহারকারী ইন্টারঅ্যাকশন বা ইভেন্ট (যেমন বাটন ক্লিক) ঘটলে, সেই ইভেন্ট সাধারণত Parent Window বা তার Controller (কন্ট্রোলার ক্লাস) দ্বারা হ্যান্ডল করা হয়। উদাহরণস্বরূপ, Parent Window ইভেন্টের জন্য কোড লিখে Child Window এর পরিবর্তন রেন্ডার করতে পারে।

Code Example:

void CMainFrame::OnCommand(UINT nID)
{
    if (nID == ID_CHILD_BUTTON)
    {
        // Handle the Child Window's button click event
    }
}

এখানে, Parent Window ইভেন্ট হ্যান্ডলার OnCommand মেথডে Child Window এর বাটন ক্লিক ইভেন্ট হ্যান্ডল করছে।


Parent এবং Child Window এর মধ্যে ডেটা শেয়ার

Parent Window এবং Child Window এর মধ্যে ডেটা শেয়ার করার জন্য বিভিন্ন পদ্ধতি ব্যবহার করা যেতে পারে, যেমন:

  1. Direct Function Calls: Parent Window Child Window এর মেথড কল করে ডেটা পাস করতে পারে।
  2. Message Passing: Parent এবং Child Window এর মধ্যে মেসেজ পাস করে ডেটা শেয়ার করা যায়।
  3. Shared Variables: একই অ্যাপ্লিকেশনে থাকা Parent এবং Child Window একই ভেরিয়েবল শেয়ার করতে পারে।

Code Example (Message Passing):

// Parent Window sends a message to Child Window
SendMessage(WM_USER_UPDATE, 0, (LPARAM)"Updated Data");

এখানে, Parent Window Child Window কে WM_USER_UPDATE মেসেজ পাঠাচ্ছে যা Child Window তে ডেটা আপডেট করতে পারে।


Parent এবং Child Window এর মধ্যে ডায়ালগ সম্পর্ক

MFC তে Dialog Box একটি Child Window হিসেবে কাজ করে, যেখানে Parent Window ইভেন্ট এবং ডেটা নিয়ন্ত্রণ করে। সাধারণত ডায়ালগ বক্সের মাধ্যমে ইনপুট নেওয়া হয়, এবং Parent Window সেই ইনপুট ডেটা প্রক্রিয়া করে।

Code Example:

CMyDialog myDlg;
if (myDlg.DoModal() == IDOK)
{
    CString str = myDlg.GetData();  // Parent Window ডায়ালগের ডেটা গ্রহণ করবে
}

এখানে, CMyDialog একটি Child Window (ডায়ালগ) হিসেবে Parent Window এর মধ্যে তৈরি করা হয়েছে এবং Parent Window তার ডেটা গ্রহণ করেছে।


সারাংশ

Parent Window এবং Child Window হল MFC অ্যাপ্লিকেশনের দুটি মূল উইন্ডো কনসেপ্ট, যেখানে Parent Window একটি মূল উইন্ডো হিসেবে কাজ করে এবং অনেকগুলি Child Window ধারণ করতে পারে। Parent Window অন্যান্য Child Window গুলির নিয়ন্ত্রণ এবং ইনপুট পরিচালনা করে। তাদের মধ্যে সম্পর্ক Hierarchy-based এবং Message Passing এর মাধ্যমে কাজ করে, যার ফলে একটি উইন্ডো আরেকটির উপর নির্ভরশীল হয়। Child Window সাধারণত ব্যবহারকারী ইন্টারঅ্যাকশন বা ইনপুট গ্রহণ করে এবং Parent Window সেই ইনপুট প্রক্রিয়া করে।

Content added By

MFC (Microsoft Foundation Classes) অ্যাপ্লিকেশনে Window Messages এবং Message Handling খুবই গুরুত্বপূর্ণ ধারণা। Window Messages হল অ্যাপ্লিকেশন এবং উইন্ডো সিস্টেমের মধ্যে যোগাযোগের মাধ্যম, এবং Message Handling হল এই বার্তাগুলিকে প্রসেস করার প্রক্রিয়া। এই সিস্টেমের মাধ্যমে উইন্ডো ইভেন্ট এবং ইউজার ইন্টারঅ্যাকশন পরিচালনা করা হয়।


Window Messages কী?

Window Messages হল অ্যাপ্লিকেশন বা অপারেটিং সিস্টেম দ্বারা পাঠানো বার্তা যা উইন্ডো (যেমন ফ্রেম, বাটন, বা টেক্সট ফিল্ড) বা অ্যাপ্লিকেশনের মধ্যে ইন্টারঅ্যাকশন তৈরি করে। উদাহরণস্বরূপ, WM_PAINT বার্তা উইন্ডোকে পুনরায় আঁকার নির্দেশ দেয়, WM_KEYDOWN বার্তা কী প্রেস ইভেন্টকে প্রতিনিধিত্ব করে, এবং WM_LBUTTONDOWN বার্তা মাউসের বাম বোতাম ক্লিকের ইভেন্টকে প্রতিনিধিত্ব করে।

এগুলি সাধারণত উইন্ডো মেসেজ লুপের মাধ্যমে প্রসেস করা হয়।


Window Messages এর ধরণ

MFC তে কিছু জনপ্রিয় Window Messages এর উদাহরণ নিচে দেওয়া হলো:

  • WM_CREATE: একটি উইন্ডো তৈরি হওয়ার সময় পাঠানো হয়।
  • WM_DESTROY: উইন্ডো ধ্বংস হওয়ার সময় পাঠানো হয়।
  • WM_PAINT: উইন্ডোতে পেইন্টিং বা রিফ্রেশ করার জন্য পাঠানো হয়।
  • WM_SIZE: উইন্ডোর আকার পরিবর্তন হলে পাঠানো হয়।
  • WM_KEYDOWN: কিবোর্ডে কোনো কী চাপা হলে পাঠানো হয়।
  • WM_LBUTTONDOWN: মাউসের বাম বাটন প্রেস হলে পাঠানো হয়।
  • WM_COMMAND: মেনু বা টুলবার কমান্ডের জন্য পাঠানো হয়।

এই বার্তাগুলি অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে ইন্টারঅ্যাকশন ও কাজ পরিচালনা করে।


Message Handling কী?

Message Handling হল সেই প্রক্রিয়া, যার মাধ্যমে উইন্ডো মেসেজগুলির প্রতি অ্যাপ্লিকেশন প্রতিক্রিয়া জানায়। MFC তে, Message Map ব্যবহৃত হয় মেসেজ হ্যান্ডলিংয়ের জন্য। Message Map হল একটি ম্যাক্রো সেট যা উইন্ডোর মেসেজগুলিকে সংশ্লিষ্ট হ্যান্ডলারের ফাংশনে পরিচালিত করে।


Message Map এর ব্যবহার

MFC তে Message Map ব্যবহার করে উইন্ডো মেসেজ হ্যান্ডলিং করা হয়। Message Map ম্যাক্রোতে, উইন্ডো মেসেজের জন্য সংশ্লিষ্ট ফাংশন সনাক্ত করা হয়। প্রতিটি উইন্ডো মেসেজের জন্য একটি ফাংশন থাকে যা সেই মেসেজের প্রতিক্রিয়া জানায়।

Message Map তৈরি করার ধাপসমূহ

  1. Message Map Declaration: প্রথমে, ক্লাসের মধ্যে BEGIN_MESSAGE_MAP এবং END_MESSAGE_MAP ম্যাক্রো দিয়ে মেসেজ মেপিং শুরু ও শেষ করা হয়।

    Code Example:

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
        ON_WM_PAINT()        // WM_PAINT বার্তা হ্যান্ডলিং
        ON_WM_SIZE()         // WM_SIZE বার্তা হ্যান্ডলিং
        ON_COMMAND(ID_FILE_NEW, &CMainFrame::OnFileNew)
    END_MESSAGE_MAP()
    
  2. Message Handler Implementation: এরপর, মেসেজ মেপিংয়ের মাধ্যমে প্রতিটি মেসেজের জন্য সংশ্লিষ্ট হ্যান্ডলার ফাংশন তৈরি করতে হয়। উদাহরণস্বরূপ:

    Code Example:

    void CMainFrame::OnPaint()
    {
        CPaintDC dc(this); // সঠিকভাবে পেইন্ট করার জন্য DC ব্যবহার করুন
        // উইন্ডোতে আঁকার কোড
    }
    
    void CMainFrame::OnSize(UINT nType, int cx, int cy)
    {
        // উইন্ডোর আকার পরিবর্তন হলে কাজ করুন
    }
    
    void CMainFrame::OnFileNew()
    {
        AfxMessageBox(_T("New File Command Triggered"));
    }
    

Common Window Messages এবং তাদের হ্যান্ডলার

1. WM_PAINT:

এই বার্তা উইন্ডোতে পুনরায় আঁকার জন্য পাঠানো হয়। এটি সাধারণত OnPaint() ফাংশনের মাধ্যমে হ্যান্ডল করা হয়।

Code Example:

void CMainFrame::OnPaint()
{
    CPaintDC dc(this); // Paint Device Context
    // উইন্ডোর কাস্টম গ্রাফিক্স বা টেক্সট আঁকার কোড
    dc.TextOut(50, 50, _T("Hello, MFC!"));
}

2. WM_SIZE:

যখন উইন্ডোর আকার পরিবর্তিত হয়, তখন WM_SIZE বার্তা পাঠানো হয়। এটি সাধারণত OnSize() ফাংশনের মাধ্যমে হ্যান্ডল করা হয়।

Code Example:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    CFrameWnd::OnSize(nType, cx, cy);
    // উইন্ডোর আকার পরিবর্তন হলে আরও কিছু কোড
}

3. WM_KEYDOWN:

কীবোর্ডে একটি কী চাপা হলে WM_KEYDOWN বার্তা পাঠানো হয়। এটি সাধারণত OnKeyDown() ফাংশনের মাধ্যমে হ্যান্ডল করা হয়।

Code Example:

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if (nChar == VK_RETURN) // Enter key pressed
    {
        AfxMessageBox(_T("Enter key pressed"));
    }
}

4. WM_LBUTTONDOWN:

মাউসের বাম বাটন ক্লিক হলে WM_LBUTTONDOWN বার্তা পাঠানো হয়। এটি সাধারণত OnLButtonDown() ফাংশনের মাধ্যমে হ্যান্ডল করা হয়।

Code Example:

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
    AfxMessageBox(_T("Left mouse button clicked"));
}

Message Handling এর গুরুত্বপূর্ণ পয়েন্ট

  • Message Map ব্যবহার করে মেসেজগুলিকে যথাযথ ফাংশনে হ্যান্ডল করা হয়।
  • MFC তে, উইন্ডো মেসেজগুলি সাধারণত ON_COMMAND, ON_WM_PAINT, ON_WM_SIZE, ON_WM_KEYDOWN ইত্যাদি ম্যাক্রো দিয়ে হ্যান্ডল করা হয়।
  • Message Map তে উইন্ডো মেসেজের জন্য সংশ্লিষ্ট হ্যান্ডলার ফাংশন সংজ্ঞায়িত করা হয়।
  • PreTranslateMessage() ফাংশন ব্যবহার করে আপনি বার্তা প্রসেসিং এর আগে কিছু অতিরিক্ত লজিক বা ফিল্টার যুক্ত করতে পারেন।

সারাংশ

MFC অ্যাপ্লিকেশনে Window Messages এবং Message Handling হল গুরুত্বপূর্ণ বিষয়, যা উইন্ডো ইভেন্ট এবং ইউজার ইন্টারঅ্যাকশন পরিচালনা করতে সহায়তা করে। Message Map এবং Message Handlers এর মাধ্যমে উইন্ডো মেসেজগুলির সঠিক প্রক্রিয়াকরণ সম্ভব হয়, যা অ্যাপ্লিকেশনের কার্যকারিতা এবং ইউজার এক্সপেরিয়েন্স উন্নত করে।

Content added By
Promotion

Are you sure to start over?

Loading...