30
Chapter 1: Hello, MFC Windows Programming Model Department of Digital Contents Sang Il Park

Chapter 1: Hello, MFC Windows Programming Model

  • Upload
    stamos

  • View
    70

  • Download
    5

Embed Size (px)

DESCRIPTION

Chapter 1: Hello, MFC Windows Programming Model. Department of Digital Contents Sang Il Park. Programming Models. Procedural Programming model Event-Driven Programming model (windows programming model). Procedural Programming Model. int main() { funcA(); funcB(); return 0; }. - PowerPoint PPT Presentation

Citation preview

Chapter 1: Hello, MFCWindows Programming Model

Department of Digital Contents

Sang Il Park

Programming Models

1. Procedural Programming model

2. Event-Driven Programming model(windows programming model)

Procedural Programming Model

int main(){ funcA();

funcB();

return 0;}

int main(){ funcA();

funcB();

return 0;}

{ …… return;}

{ …… return;}

{ funcC(); return;}

{ funcC(); return;}

{ ….. return;}

{ ….. return;}

Procedural Programming Model

– Starts with “Main()” function– Ends when main returns– Calls functions sequentially– Basically main function calls other functions

(it determines what is called and when)

Event-driven Programming Model

EVENT!!!

Help me!

Message

Event Handlin

g

Event-driven Programming Model

int WinMain(){

return 0;}

int WinMain(){

return 0;}

Message Loop

Messag

e 1

Messag

e 2

Messag

e 3

Window ProcedureWindow Procedure

– Begins with “WinMain()” function– Starts a massage loop in the WinMain for waiting

messages– Gets messages from operating system, a user or

the program.– Messages are processed by windows procedure– Ends when Quit message is given

Event-driven Programming Model

• Event-Driven Programming Model with more details:

Messages, messages and more Messages

Message Sent When

WM_CHAR A character is input from the keyboard.

WM_COMMAND The user selects an item from a menu, or a control sends a notification to its parent.

WM_CREATE A window is created.

WM_DESTROY A window is destroyed.

WM_LBUTTONDOWN

The left mouse button is pressed.

WM_LBUTTONUP The left mouse button is released.

WM_MOUSEMOVE The mouse pointer is moved.

WM_PAINT A window needs repainting.

WM_QUIT The application is about to terminate.

WM_SIZE A window is resized.

Common Windows Messages

A Simple Event-driven Coding Practice

Event-driven example

• Using C++, Take an integer number as an input from the user and do as follows:– If the input is ‘1’, then print “Sejong University”,– If the input is ‘2’, then print “Digital Contents”,– If the input is ‘3’, then print “Bye~” and quit, – Take a new input and repeat.

Code: #include <iostream>using namespace std;

int main(){

int i;while(true){

cout<<"Input: ";cin>>i;

switch(i){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;return 0;break;

default:break;

}}return 0;

}

#include <iostream>using namespace std;

int main(){

int i;while(true){

cout<<"Input: ";cin>>i;

switch(i){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;return 0;break;

default:break;

}}return 0;

}

Event-driven example

• Using C++, Takes an integer number as an input from the user– If the input is ‘1’, then print “Sejong University”,– If the input is ‘2’, then print “Digital Contents”,– If the input is ‘3’, then print “Bye~” and quit, – Take a new input and repeat.

Windows Procedure

Message (Event) Message (Event) Handler

Message Loop

Code: #include <iostream>using namespace std;

int main(){

int i;while(true){

cout<<"Input: ";cin>>i;

switch(i){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;return 0;break;

default:break;

}}return 0;

}

#include <iostream>using namespace std;

int main(){

int i;while(true){

cout<<"Input: ";cin>>i;

switch(i){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;return 0;break;

default:break;

}}return 0;

}

MessageMessage

Message Handler

Message Handler

MessageLoop

MessageLoop

A fancier code:int main(){

int i;

while(true){

cout<<"Input: ";cin>>i;procedure(i);

}return 0;

}

int main(){

int i;

while(true){

cout<<"Input: ";cin>>i;procedure(i);

}return 0;

}

void procedure(int msg){

switch(msg){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;exit(0);break;

default:break;

}}

void procedure(int msg){

switch(msg){case 1:

cout<<"Sejong University"<<endl;break;

case 2:cout<<"Digital Contents"<<endl;break;

case 3:cout<<"Bye!"<<endl;exit(0);break;

default:break;

}}

API Windows Programming(or SDK-Style)

Win32 ? (= Windows API)

• Programming is not making everything from nothing

• Programming is rather assembling existing functions and data types

• Extended Functions and data types are distributed as a form of library – Ex.)

2D drawing functions (OpenCV library), 3D drawing functions (OpenGL library), Playing music functions (DirectShow library) and so on

Win32 ? ( = Windows API)

• API (Application Programming Interface)– A library contains functions for controlling and

using operating system. – Mostly C functions.

• Win32– Name of the Windows API– Collection of C functions for making windows

programming (library)– Ex.) Functions for “creating new windows”,

“adding a button”, “adding a new menu” and so on.

Begin Win32 Project

• FileNewProjectWin32 Project

Begin Win32 Project

• Application Setting

Begin Win32 Project

• Set “Character Set ” as “Not Set ”

Adding “Main.cpp” #include <windows.h>LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ WNDCLASS wc; HWND hwnd; MSG msg;

wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";

RegisterClass (&wc);

hwnd = CreateWindow ( "MyWndClass", // WNDCLASS name "SDK Application", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, // Horizontal position CW_USEDEFAULT, // Vertical position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height HWND_DESKTOP, // Handle of parent window NULL, // Menu handle hInstance, // Application's instance handle NULL // Window-creation data );

ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd);

while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;}

#include <windows.h>LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ WNDCLASS wc; HWND hwnd; MSG msg;

wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";

RegisterClass (&wc);

hwnd = CreateWindow ( "MyWndClass", // WNDCLASS name "SDK Application", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, // Horizontal position CW_USEDEFAULT, // Vertical position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height HWND_DESKTOP, // Handle of parent window NULL, // Menu handle hInstance, // Application's instance handle NULL // Window-creation data );

ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd);

while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;

switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); Ellipse (hdc, 0, 0, 200, 100); EndPaint (hwnd, &ps);

return 0;

case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam);}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;

switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); Ellipse (hdc, 0, 0, 200, 100); EndPaint (hwnd, &ps);

return 0;

case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam);}

Compile and Run it!

Code looks complex, but…#include <windows.h>LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ WNDCLASS wc; HWND hwnd; MSG msg;

wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";

RegisterClass (&wc);

hwnd = CreateWindow ( "MyWndClass", // WNDCLASS name "SDK Application", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, // Horizontal position CW_USEDEFAULT, // Vertical position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height HWND_DESKTOP, // Handle of parent window NULL, // Menu handle hInstance, // Application's instance handle NULL // Window-creation data );

ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd);

while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;}

#include <windows.h>LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ WNDCLASS wc; HWND hwnd; MSG msg;

wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";

RegisterClass (&wc);

hwnd = CreateWindow ( "MyWndClass", // WNDCLASS name "SDK Application", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, // Horizontal position CW_USEDEFAULT, // Vertical position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height HWND_DESKTOP, // Handle of parent window NULL, // Menu handle hInstance, // Application's instance handle NULL // Window-creation data );

ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd);

while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;

switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); Ellipse (hdc, 0, 0, 200, 100); EndPaint (hwnd, &ps);

return 0;

case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam);}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;

switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); Ellipse (hdc, 0, 0, 200, 100); EndPaint (hwnd, &ps);

return 0;

case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam);}

SAME STRUCTURE!SAME STRUCTURE!

Little change in WinProc

• In the switch statements of WinProc:case WM_PAINT:hdc = BeginPaint(hWnd, &ps);Ellipse (hdc, 0, 0, 200, 100);

RECT rect;GetClientRect(hwnd, &rect);DrawText(hdc, "hello, Windows", -1, &rect,

DT_SINGLELINE|DT_CENTER|DT_VCENTER);

EndPaint(hWnd, &ps);return 0;

case WM_PAINT:hdc = BeginPaint(hWnd, &ps);Ellipse (hdc, 0, 0, 200, 100);

RECT rect;GetClientRect(hwnd, &rect);DrawText(hdc, "hello, Windows", -1, &rect,

DT_SINGLELINE|DT_CENTER|DT_VCENTER);

EndPaint(hWnd, &ps);return 0;

Add this!Add this!

A Little more change in WinProc

• In the switch statement, add more event handler:

case WM_LBUTTONDOWN:

MessageBox(hwnd, "haha", "Test!"), MB_OK);

break;

case WM_LBUTTONDOWN:

MessageBox(hwnd, "haha", "Test!"), MB_OK);

break;

Add thisAdd this

Result:

Summary:

WinMain(…) main function{

WNDCLASS … Define a new programCreateWindows (…) Create a window

while( GetMessage (…)) Message Loop{

DispatchMessage(…) Message Handler} (Windows Procedure)

}

Win32 Program Structure

Then, What is MFC ?

To be continued…

Back in your home…

• Read and try:Chapter1 – The Windows Programming

modelChapter1 – Introducing MFCChapter1 – Your First MFC Application