Petzold example question

Ive been following petzolds book and understanding everything line by line up until this example(Im very OCD about that). Im not very fluent in C I started with C++ and worked my way up, is this C?

y << 8 | x;

and here are the callbacks for the example there is one in the child window creation loop and above the WM_SETFOCUS message callback.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, LPARAM lParam, WPARAM wParam)
{
	static HWND hwndChild[DIVISIONS][DIVISIONS];
	int			cxBlock, cyBlock, x, y;

	switch(message)
	{
	case WM_CREATE:
		for (x = 0; x<DIVISIONS; x++)
			for(y = 0; y< DIVISIONS; x++)
				hwndChild[x][y] = CreateWindow(szMyChild, NULL,
				WS_CHILDWINDOW| WS_VISIBLE, 0,0, 0, 0, hwnd, (HMENU) (y << 8 | x),(HINSTANCE),GetWindowLong(hwnd, GWLP_HINSTANCE),NULL);
		return 0;
	case WM_SIZE:
		cxBlock = LOWORD (lParam);
		cyBlock = HIWORD (lParam);
		
		for(x = 0; x < DIVISIONS ; x++)
			for( y = 0; y < DIVISIONS; y ++)
					MoveWindow(hwndChild [x][y], 
						x * cxBlock, y * cyBlock,
							cxBlock, cyBlock, TRUE);
		return 0;
	case WM_LBUTTONDOWN:
		MessageBeep(0);
		return 0;
	case WM_SETFOCUS:
		SetFocus( GetDlgItem(hwnd, idFocus));
		return 0;
	case WM_KEYDOWN:
		x = idFocus & 0xFF;
		y = idFocus >> 8;
		switch(wParam){
		case VK_UP:    y--;  break;
		case VK_DOWN:  y++;  break;
		case VK_LEFT:  x--;  break;
		case VK_RIGHT: x++;  break;
		case VK_HOME:  x = y = 0; break;
		case VK_END:   x = y = DIVISIONS - 1; break;
		default: return 0;
		}
		x = (x+DIVISIONS) % (DIVISIONS);
		y = (y +DIVISIONS) % (DIVISIONS);

		idFocus = y<< 8 | x;

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

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	
	switch(message)
	{
	case WM_CREATE:
		SetWindowLong(hwnd, 0, 0);
		return 0;
	case WM_KEYDOWN:
		if(wParam != VK_RETURN && wParam != VK_SPACE)
		{
			SendMessage(GetParent(hwnd), message, wParam, lParam);
			return 0;
		}
	case WM_LBUTTONDOWN:
		SetWindowLong(hwnd, 0, 1 ^ GetWindowLong(hwnd, 0));
		SetFocus(hwnd);
		InvalidateRect(hwnd,NULL,FALSE);
		return 0;
	case WM_SETFOCUS:
		idFocus = GetWindowLong(hwnd, GWL_ID);
	case WM_KILLFOCUS:
		InvalidateRect(hwnd, NULL, TRUE);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		Rectangle(hdc, 0, 0, rect.right, rect.bottom);

		if(GetWindowLong(hwnd, 0))
		{
			MoveToEx(hdc, 0, 0, NULL);
			LineTo(hdc, rect.right, rect.bottom);
			MoveToEx(hdc, 0, rect.bottom, NULL);
			LineTo(hdc, rect.right, 0);
		}

		if(hwnd == GetFocus())
		{
			rect.left += rect.right / 10;
			rect.right -= rect.left;
			rect.top += rect.bottom / 10;
			rect.bottom -= rect.top;

			SelectObject(hdc, GetStockObject(NULL_BRUSH));
			SelectObject(hdc, CreatePen(PS_DASH, 0, 0));
			Rectangle(hdc, rect.left, rect.top, rect.right,rect.bottom);
			DeleteObject(SelectObject(hdc,GetStockObject(BLACK_PEN)));

			EndPaint(hwnd, &ps);
			return 0;
		
		}
		return DefWindowProc(hwnd, message, wParam, lParam);
	}

}[code]
Last edited on
 
idFocus = y<< 8 | x;


idFocus is the result of shifting whatever is in y leftward 8 bits and or'ing this later quantity against whatever is in x.

Using code tags would help. That syntax isn't unique to C.

Last edited on
Thanks there was no explanation in the book about this and the future examples were the same so i was left scratching my head.

So when you use the << operator your really pushing bits to encompass the stuff on the right side. So in essence its the same as allocating memory for a value or a string in assembly?
Last edited on
I don't know if I'd put it that way. Do a search on C Bitwise Shift Operators or C Shift Operators and that will explain it if you aren't familiar with it. I havn't done assembly in ages, but if I recall correctly there were SHL and SHR or something like that for shifting bits around. They just move them about within a variable. If there isn't room the one's on the left or right edge just disappear or rotate around to the other side. But in your example, I see x and y are ints, so they've got 32 bits. So whatever the bits are they all get shifted left 8 bits. Then x, which may be functioning as a bit mask, gets or'ed against whatever is now in y. idFocus gets the result of those manipulations. I'm not familiar with that Petzold example, but he was a master at those kinds of things!
Topic archived. No new replies allowed.